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



我使用Spring 5.1.17, H2 (In Memory) Database 1.4.200和Hibernate。

我使用内存中的H2数据库进行测试,并尝试在每次测试后重置它。为此,我使用Liquibase创建了我的数据库,并生成了一个.sql文件。所以我的计划是,在每次测试之后,我通过执行这个.sql文件初始化一个新的内存DB。为此,我不想删除所有表(因为时间)。我只想关闭数据库并创建一个新的内存DB,我可以通过执行sql文件初始化(在每个测试之前)。为此,我需要通过执行SQL语句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);

但是这行不通!只有当我之前没有关闭数据库时才会起作用。因此,当我运行我的spring应用程序(使用dataSource bean)并使用sql文件而不是Liquibase changlogs初始化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", "");

但是当我第一次运行测试,关闭数据库并尝试连接&init新数据库时,我没有得到任何日志,并且接下来的测试都将失败,因为没有表。因此,似乎不会创建新的DB。我错在哪里?还是说我想做的是不可能的?

我想你可以添加到

spring.jpa.hibernate.ddl-auto=update

应用程序。属性文件。

快速阅读文档显示以下内容:

默认情况下,关闭与数据库的最后一个连接将关闭数据库。对于内存数据库,这意味着内容丢失。为了保持数据库打开,在数据库URL中添加;DB_CLOSE_DELAY=-1。将内存中数据库的内容保持与虚拟数据库一样长的时间DB_CLOSE_DELAY=-1.

当您显式配置DB_CLOSE_DELAY=0时,情况似乎是这样的。

尝试将其设置为-1,像这样的东西应该可以奏效:jdbc:h2:mem:test;MODE=MSSQLServer;INIT=runscript from 'myPath/initFile.sql';DB_CLOSE_DELAY=-1

相关内容

  • 没有找到相关文章

最新更新