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

具有“内存模式”的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() );
        }
    }
}

请帮助.谢谢.

最佳答案 您可以将
persistent mode
large cache一起使用.“大”我的意思是使整个数据库适合内存.这样,即使表扫描也不会从磁盘读取.

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

点赞