为什么关闭后无法连接到内存中的新h2数据库?

v6ylcynt  于 2021-07-23  发布在  Java
关注(0)|答案(3)|浏览(697)

我使用spring5.1.17、h2(内存中)数据库1.4.200和hibernate。
我使用内存中的h2数据库进行测试,并在每次测试后尝试重置它。为此,我使用liquibase创建了数据库并生成了一个.sql文件。所以我的计划是,在每次测试之后,通过执行这个.sql文件初始化一个新的内存数据库。为此,我不想删除所有表(因为时间)。我只想关闭数据库并创建一个新的内存数据库,我可以通过执行sql文件初始化它(在每次测试之前)。为此,我需要通过执行sql语句来关闭db SHUTDOWN . 然后我得到以下日志:

2021-02-12 12:59:57 database: disconnecting session #14
2021-02-12 12:59:57 database: disconnected session #14
2021-02-12 12:59:57 database: disconnecting session #3
2021-02-12 12:59:57 database: disconnected session #3
...
2021-02-12 12:59:57 database: disconnecting session #15
2021-02-12 12:59:57 database: closing mem:test
2021-02-12 12:59:57 database: closed
2021-02-12 12:59:57 database: disconnected session #15

看起来不错。现在,我尝试使用相同的url连接到内存中的(新)db:

...
String url = jdbc:h2:mem:test;MODE=MSSQLServer;INIT=runscript from 'myPath/initFile.sql';DB_CLOSE_DELAY=0";
connection = DriverManager.getConnection(url, user, pass);

但这行不通!它只在我以前没有关闭db的情况下工作。因此,当我运行我的spring应用程序(使用datasource bean)并用sql文件而不是liquibase changelogs初始化db时,我得到以下日志,我的测试将正确通过:

/*SQL #:104 t:152*/runscript from 'myPath/initFile.sql';
2021-02-12 13:07:42 command: slow query: 152 ms
/**/Connection conn6 = DriverManager.getConnection("jdbc:h2:mem:test;INIT=runscript from 'myPath/initFile.sql';MODE=MSSQLServer;DB_CLOSE_DELAY=0", "username", "");

但是当我第一次运行一个测试,关闭db并尝试连接&初始化新的db时,我没有得到任何日志,接下来的测试都会失败,因为没有表。因此,似乎没有新的数据库将被创建。我犯了什么错?或者我不可能这么做?

vjrehmav

vjrehmav1#

我想你可以补充一下

spring.jpa.hibernate.ddl-auto=update

在application.properties文件中。

zazmityj

zazmityj2#

快速阅读文档可以发现以下内容:
默认情况下,关闭与数据库的最后一个连接将关闭数据库。对于内存中的数据库,这意味着内容丢失。要保持数据库打开,请添加;db\u close\u delay=-1到数据库url。要在虚拟机处于活动状态时保留内存中数据库的内容,请使用jdbc:h2:mem:test;db\u close\u delay=-1。
正如您明确配置的那样 DB_CLOSE_DELAY=0 这似乎是事实。
试着把它设置为 -1 ,类似这样的操作应该可以: jdbc:h2:mem:test;MODE=MSSQLServer;INIT=runscript from 'myPath/initFile.sql';DB_CLOSE_DELAY=-1

z2acfund

z2acfund3#

我发现,当我在关机和再次初始化之间等待300毫秒时,它就工作了。所以问题是我重建的太快了。但这更多的是一个解决办法,没有好的解决办法。我没有找到解决这个问题的好办法。有什么想法吗?

相关问题