【问题标题】:Any ideas for persisting H2 Database In-Memory mode transaction?持久化 H2 数据库内存模式事务的任何想法?
【发布时间】:2013-08-12 11:51:04
【问题描述】:

以下用于“内存模式”的 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() );
        }
    }
}

请帮助。谢谢。

【问题讨论】:

  • 您不能将persistent mode 与large cache 一起使用吗?至于持久化内存数据库,您考虑过SCRIPT TO 命令吗?
  • 大缓存是一个不错的选择,但不适用于聚合查询或在没有索引的情况下需要全表扫描的查询。此外,显式添加缓存索引将被证明是一个很好的策略。 SCRIPT TO 看起来很有希望,但必须像检查点同步一样触发以获取数据库的定期快照,以在任何系统故障/断电/内存不足的情况下最大限度地恢复到最新的数据库状态。你怎么说托马斯穆勒?

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


【解决方案1】:

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

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

【讨论】:

  • 顺便说一句,即使提供较大的缓存大小,也需要 sql 引擎至少一次将数据的一部分从磁盘移动到缓存中,这需要为该查询提供服务,然后该数据可以保留在缓存中.但顺便说一下,内部缓存如何工作仍然是一个问题。您可以在持久模式下显式命令 H2 以在缓存中保留一些“X”表吗?而对于“SCRIPT TO”,它在某种程度上看起来很有希望用于内存模式,但它必须像检查点事件一样被触发,以定期对数据库进行快照,以在发生任何故障时最大限度地恢复到最近的近时间数据库状态。
  • “至少一次只将那部分数据从磁盘移动到缓存”:当然,您还想如何将数据从磁盘加载到内存?如果您不想将其加载到内存中,那么您根本不需要持久化更改。 “内部缓存如何工作仍然是一个问题”:您的问题是什么,为什么需要知道?
【解决方案2】:

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

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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多