繁体   English   中英

与内存数据库中的同一H2建立多个连接[重复]

[英]Make multiple connections to same H2 In memory Database [duplicate]

这个问题已经在这里有了答案:

我经常遇到相同的问题:我想使用内存数据库在DAO上执行单元测试。 我正在使用H2,但是我相信问题与HSQLDB几乎相同。 我的单元测试涉及三个步骤:

  • 创建数据库并设置数据库模式(例如,使用SQL脚本)
  • 在数据库中插入测试所需的数据(例如:使用DbUnit)
  • 进行实际测试

在非常简单的情况下,可以对所有三个步骤使用完全相同的连接,但是一旦事情变得稍微复杂一点(例如,当使用查询数据库的框架而不是使用直接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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM