有关持久H2数据库内存模式事务的任何想法?

时间:2013-08-10 19:08:13

标签: sql database h2 in-memory-database data-persistence

以下具有“内存模式”的H2数据库代码运行完全正常,直到连接打开或VM正在运行。但是当连接关闭或VM关闭发生时,H2 db会丢失数据。有没有其他方法可以在多个启动关闭/在线 - 离线循环中保留数据?

一种方法是通过跟踪从应用程序发出的DDL和DML以及在后台检查磁盘和内存上数据完整性的同步过程来创建内存数据库的基于磁盘的副本。基于磁盘的DML可能会更慢+在每次启动时将磁盘数据复制/加载到内存的额外开销也会存在,但仍然可以在某种程度上实现持久性。

H2是否还有其他方式可以解决内存模式或任何其他变通方法的持久性问题?

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class H2InMemoryModeTest {        

public static void main(String[] args)
    {
        try
        {
            Class.forName("org.h2.Driver");

           DriverManager.getConnection("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1","sa","sa");

            Statement stmt = con.createStatement();

            //stmt.executeUpdate( "DROP TABLE table1" );
            stmt.executeUpdate( "CREATE TABLE table1 ( user varchar(50) )" );
            stmt.executeUpdate( "INSERT INTO table1 ( user ) VALUES ( 'John' )" );
            stmt.executeUpdate( "INSERT INTO table1 ( user ) VALUES ( 'Smith' )" );
            ResultSet rs = stmt.executeQuery("SELECT * FROM table1");

            while( rs.next() )
            {
                String name = rs.getString("user");
                System.out.println( name );
            }
            stmt.close();
            con.close();
        }
        catch( Exception e )
        {
            System.out.println( e.getMessage() );
        }
    }
}

请帮助。感谢。

2 个答案:

答案 0 :(得分:3)

您可以将persistent modelarge cache一起使用。使用'large'我的意思是整个数据库适合内存。这样,即使表扫描也不会从磁盘读取。

要保留内存数据库,可以使用SCRIPT命令,但需要手动执行。

答案 1 :(得分:-1)

按照我下面的代码更改

并不是那么困难

请改变 spring.datasource.url = JDBC:H 2:〜/测试; MVCC = TRUE; DB_CLOSE_DELAY = -1; MODE =甲骨文 这将在本地系统中创建一个测试数据文件 C:\ Users \ yourname ..这里test.mv文件将创建

我希望它可以帮到你