4

以下具有“内存模式”的 H2 数据库代码运行良好,直到连接打开或 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() );
        }
    }
}

请帮助。谢谢。

4

2 回答 2

4

您可以使用具有大缓存的持久模式。我的意思是“大”,以便整个数据库适合内存。这样即使表扫描也不会从磁盘读取。

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

于 2013-08-11T07:53:30.813 回答
0

按照我下面的代码更改并没有那么困难

请更改 spring.datasource.url=jdbc:h2:~/test;MVCC=true;DB_CLOSE_DELAY=-1;MODE=Oracle 这将在本地系统 C:\Users\yourname 中创建一个测试数据文件 .. 这里测试。 mv 文件将创建

我希望它可以帮助你

于 2017-08-24T06:09:47.573 回答