【问题标题】:Saving in-memory H2 database to disk将内存中的 H2 数据库保存到磁盘
【发布时间】:2012-03-24 22:55:02
【问题描述】:

如何以二进制模式将完整的嵌入式 h2 内存数据库保存/加载到某个文件或目录以加快加载速度。

我想用它来缓存数据,这样我就不必每次都运行 create table/insert 子句的所有行。

【问题讨论】:

  • 你可以只使用文件数据库与内存版本吗?我假设您正在使用您没有提到的框架(例如 Grails)进行自定义开发。
  • 这是一个不涉及任何框架的自定义项目。老实说,我不确定文件 db 的性能影响是什么,我想要速度并且数据将始终适合内存,所以我认为内存数据库将是最快的。数据只会被查询,所以我不想要任何不必要的保存检查。
  • @marc 使用“文件数据库”是另一回事。如果可以使用 java 或任何其他语言设置内存中的测试数据集,然后对数据集进行备份,并在每次测试后使用它恢复到初始状态,那么在单元测试中将非常有用。

标签: load save h2 embedded-database in-memory


【解决方案1】:

您可以使用常规(持久)数据库,而不是使用内存数据库。即便如此,您仍然可以使用内存中的表(创建内存表)。

将完全内存数据库持久化到磁盘的最简单方法是使用SCRIPT TO 'fileName' SQL 语句。这将创建一个 SQL 脚本。数据以文本形式存储,这听起来不是最有效的解决方案。然而,通常瓶颈是磁盘而不是格式化/解析文本。

另一种选择是创建另一个数据库,将表与内存数据库链接(使用create linked tablelink_schema 函数),然后使用create table as select 持久化表。

【讨论】:

  • 插入子句是我目前所做的,对于 1 gig 的文本,它需要一些时间,而不是 io。抱歉,我想要二元期权。
  • 更新了我的答案。对于 SCRIPT:如果不是 IO,那么它是什么?您是否使用了分析工具,例如内置分析器?
【解决方案2】:

我发现可以使用比默认 FS 快得多的 H2 虚拟 FS。所以,我这样做:

//to save dump
connection.prepareStatement("SCRIPT TO 'memFS:data.sql'").execute();
//to load dump
connection.prepareStatement("RUNSCRIPT FROM 'memFS:data.sql'").execute();

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多