[英]Make multiple connections to same H2 In memory Database [duplicate]
我经常遇到相同的问题:我想使用内存数据库在DAO上执行单元测试。 我正在使用H2,但是我相信问题与HSQLDB几乎相同。 我的单元测试涉及三个步骤:
在非常简单的情况下,可以对所有三个步骤使用完全相同的连接,但是一旦事情变得稍微复杂一点(例如,当使用查询数据库的框架而不是使用直接PreparedStatements时),每个连接只需一个连接。步骤是必需的。
问题:连接关闭后,数据库似乎已被删除。 怎么解决呢?
关于此主题, H2文档提供了两个提示:
有时需要到同一内存数据库的多个连接。 在这种情况下,数据库URL必须包含一个名称。 示例:
jdbc:h2:mem:db1
。 使用此URL访问相同的数据库仅在相同的虚拟机和类加载器环境中有效。默认情况下,关闭与数据库的最后一个连接会关闭数据库。 对于内存数据库,这意味着内容丢失。 要保持数据库打开状态,请在数据库URL上添加
;DB_CLOSE_DELAY=-1
。 要在虚拟机处于活动状态时保留内存数据库的内容,请使用jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
。
因此,第一个解决方案是在h2网址中添加;DB_CLOSE_DELAY=-1
。 但是我对此感到有些不满意,因为它说在我希望数据库只在测试运行的情况下才能生存,而数据库将永远保留在内存中。
有关DB_CLOSE_DELAY的文档提供了更多信息:
设置关闭所有连接后关闭数据库的延迟。 值-1表示在关闭延迟设置为其他值或调用
SHUTDOWN
之前,数据库永远不会关闭。 值0表示没有延迟(默认值;如果数据库的最后一个连接已关闭,则数据库将关闭)。 大于等于1的值表示关闭最后一个连接后数据库保持打开状态的秒数。
它暗示了其他解决方案,例如在关机前稍加延迟或手动调用SHUTDOWN
(我尚未找到如何在内存数据库中使用)。
最后,这是我的整理方式:由于数据库在关闭最后一个连接时关闭,因此从创建数据库到直到不再需要它时,我都会保持打开空白连接的状态。 这种解决方法有点笨拙(打开备用连接仅使数据库保持活动状态基本上是一种浪费),但这是迄今为止我发现的最优雅的解决方案。 这是抽象单元测试类的非常简化的片段,说明了该解决方案:
import org.h2.jdbcx.JdbcDataSource;
public abstract class AbstractTestDao {
private Connection blankConnection;
private DataSource dataSource;
protected DataSource getDataSource() {
return dataSource;
}
@Before
public void setup() throws SQLException {
JdbcDataSource jdbcDataSource = new JdbcDataSource();
jdbcDataSource.setUrl("jdbc:h2:mem:test");
this.dataSource = jdbcDataSource;
this.blankConnection = dataSource.getConnection();
}
@After
public void tearDown() throws SQLException {
this.blankConnection.close();
}
}
子级单元测试类将继承这一类,并使用提供的DataSource对象初始化用于查询数据库的库,并执行问题中列出的其他两个步骤。 测试完成后,空白连接将关闭,内存数据库也将关闭。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.