【发布时间】: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