在连接之间保留 H2 内存数据库

Bas*_*que 5 jdbc java h2 in-memory-database connections

我使用 Java 中的以下代码创建并使用内存中的 H2 数据库(不写入存储)进行演示和快速测试:

 Connection conn = DriverManager.getConnection( "jdbc:h2:mem:example_db" ) ;
Run Code Online (Sandbox Code Playgroud)

这第一次有效,但随后数据库似乎消失了,无法进行进一步的工作。如何随着时间的推移使用相同的内存数据库?

Bas*_*que 8

DB_CLOSE_DELAY=-1

默认情况下,H2 中的内存数据库在连接关闭后将被丢弃。

要覆盖此默认行为,请设置DB_CLOSE_DELAY为负值。您可以这样做:

  • 与 JDBC 路径建立连接时
  • 通过调用 SQL 命令

JDBC路径

要在连接关闭时保持数据库存在,请向 JDBC 路径添加一个元素。数据库将继续存在于内存中,直到您的应用程序退出。因此,您可以连续连接到同一个连续数据库。

提示:请注意数据库名称和此元素之间的分号(而不是冒号)。

Connection conn = 
    DriverManager.getConnection( 
        "jdbc:h2:mem:example_db;DB_CLOSE_DELAY=-1"  // Set `DB_CLOSE_DELAY` to `-1` to keep in-memory database in existence after connection closes.
    ) 
; 
Run Code Online (Sandbox Code Playgroud)

如果您想显式调用默认行为,请设置0。在最后一个连接关闭后丢弃数据库之前的几秒内,传递一个正整数 ( >=1 )。

手册最后一段中内存数据库部分介绍了此功能。

默认情况下,关闭最后一个数据库连接将关闭数据库。对于内存数据库来说,这意味着内容丢失。要保持数据库打开,请将 ;DB_CLOSE_DELAY=-1 添加到数据库 URL。要在虚拟机处于活动状态时保留内存数据库的内容,请使用 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1。

SQL命令

还可以在运行时通过SET DB_CLOSE_DELAY命令传递一个整数来操作此设置。

引用该文档:

设置 DB_CLOSE_DELAY int

设置所有连接都关闭时关闭数据库的延迟。该值-1意味着数据库永远不会关闭,直到关闭延迟设置为其他值或被SHUTDOWN调用。该值0表示没有延迟(默认值;如果数据库的最后一个连接关闭,则数据库将关闭)。值1及更大值表示关闭最后一个连接后数据库保持打开状态的秒数。

如果应用程序正常退出或调用 System.exit,即使设置了延迟,数据库也会立即关闭。

执行此命令需要管理员权限,因为它会影响所有连接。该命令在此连接中提交一个打开的事务。此设置是持久的。可以将此设置附加到数据库 URL:jdbc:h2:test;DB_CLOSE_DELAY=-1

例子:

SET DB_CLOSE_DELAY -1