Hibernate 内存中H2数据库的慢速批导入
我有一个具有五个属性的域类,所有属性都是字符串、整数或双精度。我正在使用H2内存中数据库作为这个域类的数据源。这是此数据库中存储的唯一对象;其余的存储在一个完全独立的MySQL数据库中 H2数据库是临时的。数据每小时从远程下载的CSV文件加载一次,并替换数据库中的旧数据。因为所有其他进程都必须等待它完成,所以尽可能快地完成是很重要的 现在,我的代码生成了大约6000个域对象的数组,然后为每个Hibernate 内存中H2数据库的慢速批导入,hibernate,grails,h2,Hibernate,Grails,H2,我有一个具有五个属性的域类,所有属性都是字符串、整数或双精度。我正在使用H2内存中数据库作为这个域类的数据源。这是此数据库中存储的唯一对象;其余的存储在一个完全独立的MySQL数据库中 H2数据库是临时的。数据每小时从远程下载的CSV文件加载一次,并替换数据库中的旧数据。因为所有其他进程都必须等待它完成,所以尽可能快地完成是很重要的 现在,我的代码生成了大约6000个域对象的数组,然后为每个保存它。这一切都在带有事务的中 这大约需要10秒来保存。使用内存中的HSQLDB数据源时,数字稍微差一点。
保存它。这一切都在带有事务的中
这大约需要10秒来保存。使用内存中的HSQLDB数据源时,数字稍微差一点。我已经尝试过按照刷新会话之类的说明进行操作,但这些操作只会增加所需的时间
加快批量插入这6000个对象的最佳解决方案是什么?放弃GORM和直接编写SQL insert语句会更快吗
// data is an array of about 6,000 domain objects
data.each { item ->
item.save()
}
是一个非常重要的用例。H2支持快速CSV导入。这很可能比使用工具时快
你说“远程下载CSV文件”。是临时文件吗?如果是,您可以从文件中使用CSV导入。最快的方法是
CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))
AS SELECT * FROM CSVREAD('test.csv');
这比先创建表然后插入要快。它也比使用批插入更快
如果没有文件,只有输入流,则可以直接使用CSV工具,使用new CSV().read(Reader r)
,从中读取行并将其插入数据库
当然,您可以尝试通过分析找出瓶颈所在。您可以使用自己的探查器,也可以使用H2的内置探查器。另请参见H2文档中的