【问题标题】:Why I can't connect to an new H2 In-Memory database after closing?为什么关闭后无法连接到新的 H2 In-Memory 数据库?
【发布时间】:2021-05-16 06:44:23
【问题描述】:

我使用 Spring 5.1.17、H2(内存中)数据库 1.4.200 和 Hibernate。

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

...
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 更改日志初始化数据库时,我得到以下日志并且我的测试将正确通过:

/*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", "");

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

【问题讨论】:

    标签: java sql sql-server spring h2


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      快速阅读documentation 会发现以下内容:

      默认情况下,关闭与数据库的最后一个连接会关闭 数据库。对于内存数据库,这意味着内容丢失。 要保持数据库打开,请将 ;DB_CLOSE_DELAY=-1 添加到数据库 URL。 将内存数据库的内容与虚拟数据库一样长 机器还活着,使用 jdbc:h2:mem:test;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

      【讨论】:

      • 这对我的计划不起作用,因为我想设置一个全新的数据库。当我将值设置为 -1 时,我必须删除所有表。
      【解决方案3】:

      我认为你可以添加到

      spring.jpa.hibernate.ddl-auto=update
      

      在 application.properties 文件中。

      【讨论】:

        猜你喜欢
        • 2020-08-12
        • 2021-03-26
        • 1970-01-01
        • 2018-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多