将内存中的H2数据库保存到磁盘

22

如何将完整的内嵌H2内存数据库以二进制模式保存/加载到某个文件或目录中,以实现更快的加载。

我希望将其用于缓存数据,这样我就不必每次运行所有的创建表/插入子句代码。


1
你能否只使用文件数据库而不是内存版本?我猜你正在使用一个未提及的框架(例如Grails)进行自定义开发。 - Marc
这是一个自定义项目,没有涉及任何框架。说实话,我不确定文件数据库的性能影响如何,我想要速度,并且数据始终适合内存,因此我认为内存数据库将是最快的。数据仅用于查询,因此我不希望进行任何不必要的保存检查。 - mikkom
1
@marc 使用“文件数据库”是一回事,但如果能够使用Java或其他语言在内存中设置测试数据集并备份该数据集,然后在每个测试之后将其恢复到初始状态,那么它将非常有用于单元测试。 - Lars Bohl
2个回答

12

你可以使用一个普通的(持久化的)数据库,而不是使用内存数据库。即使这样,你仍然可以使用内存表(创建内存表)。

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

另一种选择是创建另一个数据库,使用create linked tablelink_schema函数将表与内存数据库关联,并使用create table as select将表持久化。


插入子句是我目前正在做的事情,对于1GB的文本来说需要一些时间,而且不是io。抱歉,但我想要二进制选项。 - mikkom
1
更新了我的回答。对于脚本:如果不是IO,那它是什么?你使用过像内置分析器这样的分析工具吗? - Thomas Mueller

1

我发现可以使用比默认文件系统更快的H2虚拟文件系统。因此,我这样做:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接