H2 是我们常使用的一个内存数据库,通常这个数据库能够帮助我们在测试的时候进行逻辑测试。
如果你使用了 Hibernate 的话,首先需要设置数据库的连接,因为 H2 可以支持内存模式,也可以支持文件模式,我们下面分别对这 2 种模式的配置参数进行一些解读。
内存模式
我们可以使用下面的配置的字符串来进行内存模式的配置:
hibernate.connection.url=jdbc:h2:mem:test;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=RUNSCRIPT FROM 'classpath:schema/h2.sql'
针对内存模式,需要了解下面的重点,在 JVM 进程启动后,将会在内存中创建一个数据库,当 JVM 内存释放后,你的程序将会关闭最后的连接,当 H2 直到最后的连接被关闭后,H2 数据库将会自动从内存中删除。
jdbc:h2:mem:test
上面的命令将会在内存中创建一个 test 的数据库,这个参数中的 mem 表示的是内存中创建。
MODE=MySQL
创建的数据库使用 MySQL 兼容模式,这样如果你需要对数据库迁移到基于服务器的 MySQL 数据库上的话,你不需要对你的逻辑代码和实体进行修改。
DB_CLOSE_DELAY=-1
在默认情况下,H2 将会在最后的连接退出的时候关闭数据库。针对基于内存的数据库配置的情况下,如果在这个情况下还进行数据库连接的话,很有可能程序将会得到连接丢失的错误,如果你使用了连接池的话,通常在 JVM 退出之前,连接池都会保持有数据库连接,因此这个问题针对使用连接池的情况可能不存在。
如果你没有使用连接池的话,建议将这个参数设置为: ;DB_CLOSE_DELAY=-1
这样能够保证在虚拟机退出之前 H2 数据库不关闭连接。
DB_CLOSE_ON_EXIT=FALSE
这个参数的默认配置为 TRUE。
在默认情况下,H2 将会在最后的连接退出的时候关闭数据库,如果在这个情况下数据库没有被关闭的话,H2 将会在虚拟机退出的时候关闭数据库。
但是在一些特殊的情况下,我们并不希望虚拟机在退出的时候关闭数据库,比如说你还需要使用数据库写入一些虚拟机的情况,或者写入虚拟机的关闭过程等。
因此,在这个情况下,你需要讲这个参数配置为 TRUE。
INIT=RUNSCRIPT FROM ‘classpath:schema/h2.sql’
初始化 SQL 脚本。
通常我们会在这里配置一个初始化的脚本,因为内存数据库在初始化成功后是不会创建数据表和初始化数据的,因此我们需要让第一个链接在链接数据库后直接运行一个脚本来创建数据库,表,同时插入一些数据。
这个配置是在这里设置,classpath:
就是你当前项目的 resources 目录中。
如果下图所示的目录结构。
文件模式
文件模式的情况能够让你的测试数据在文件系统中持久化。
这种模式通常能够让有机会在程序退出的时候检查数据处理是否准确,存储和更新是否有问题。
hibernate.connection.url=jdbc:h2:file:~/h2/test;MODE=MySQL;AUTO_SERVER=TRUE
请参考上面的配置参数,和下面的一些解读。
jdbc:h2:file:~/h2/test
这个配置参数会告诉 H2 在文件系统中创建一个数据库,创建的路径为 ~/h2/test
具体来说,如果你使用的是 Windows 系统,并且当前登录的用户名为 huyuc,那么创建的数据库文件的路径为:C:\Users\huyuc\h2
AUTO_SERVER=TRUE
这个配置模式为 Automatic Mixed Mode。
用土话说就是允许多个进程同时访问数据库。
举例来说,如你运行一个测试环境,但是又想用一个 UI 工具来查看数据库中的数据情况,这个时候你需要讲这个配置参数设置为 TRUE。
因为这里是 2 个进程同时访问数据库,否则你将会得到数据库文件被占用的错误。