【问题标题】:in memory database h2 how long keep connection open?在内存数据库 h2 中保持连接打开多长时间?
【发布时间】:2015-01-19 09:28:18
【问题描述】:

我目前正在内存模式下测试 H2 DB。 我通过

建立了连接
h2Con = DriverManager.getConnection( 
                "jdbc:h2:mem:db1", "SA", "");

我想用 dbunit 进行一些导入并设置 dbUnits 数据库连接

IDataBaseConnection dBUnitConnection = new DatabaseConnection(h2con);

以及我稍后要查询的导入

所以我的问题是,在内存模式下,我什么时候可以关闭连接? 通常我会做这样的事情

try{
   //some sql query
}catch{
   //error handling
}finally{
    if(connection!=null)
        connection.close()
}

但是如果连接关闭,我会在内存中丢失数据?那么它应该保持打开状态直到我结束我的程序吗?

【问题讨论】:

    标签: java sql connection h2 in-memory-database


    【解决方案1】:

    在网址中添加DB_CLOSE_DELAY=-1

    来自H2documentation

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

    因此,您可以将 H2 配置为由于 JVM 的生命周期而保持内存数据库完整,然后您可以根据需要连接和断开连接。

    所以,这个:

    JdbcDataSource ds = new org.h2.jdbcx.JdbcDataSource();
    ds.setURL("jdbc:h2:mem:example_db_");
    ds.setUser("scott");
    ds.setPassword("tiger");
    

    …变成这样:

    JdbcDataSource ds = new org.h2.jdbcx.JdbcDataSource();
    ds.setURL("jdbc:h2:mem:example_db_;DB_CLOSE_DELAY=-1"); // ⬅ Add ‘delay’ element to URL.
    ds.setUser("scott");
    ds.setPassword("tiger");
    

    【讨论】:

      【解决方案2】:

      在某些情况下,在这种情况下不应该关闭数据库,例如因为在虚拟机关闭时仍然使用数据库(例如将关闭过程存储在数据库中)。对于这些情况,可以在数据库 URL 中禁用自动关闭数据库。第一个连接(打开数据库的连接)需要在数据库 URL 中设置选项(之后无法更改设置)。退出时禁用数据库关闭的数据库 URL 是:

      字符串 url = "jdbc:h2:~/test;DB_CLOSE_ON_EXIT=FALSE";

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-21
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        • 1970-01-01
        • 2012-12-21
        • 2012-06-17
        • 2013-09-10
        相关资源
        最近更新 更多