Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 内存中H2数据库的慢速批导入_Hibernate_Grails_H2 - Fatal编程技术网

Hibernate 内存中H2数据库的慢速批导入

Hibernate 内存中H2数据库的慢速批导入,hibernate,grails,h2,Hibernate,Grails,H2,我有一个具有五个属性的域类,所有属性都是字符串、整数或双精度。我正在使用H2内存中数据库作为这个域类的数据源。这是此数据库中存储的唯一对象;其余的存储在一个完全独立的MySQL数据库中 H2数据库是临时的。数据每小时从远程下载的CSV文件加载一次,并替换数据库中的旧数据。因为所有其他进程都必须等待它完成,所以尽可能快地完成是很重要的 现在,我的代码生成了大约6000个域对象的数组,然后为每个保存它。这一切都在带有事务的中 这大约需要10秒来保存。使用内存中的HSQLDB数据源时,数字稍微差一点。

我有一个具有五个属性的域类,所有属性都是字符串、整数或双精度。我正在使用H2内存中数据库作为这个域类的数据源。这是此数据库中存储的唯一对象;其余的存储在一个完全独立的MySQL数据库中

H2数据库是临时的。数据每小时从远程下载的CSV文件加载一次,并替换数据库中的旧数据。因为所有其他进程都必须等待它完成,所以尽可能快地完成是很重要的

现在,我的代码生成了大约6000个域对象的数组,然后为每个
保存它。这一切都在带有事务的

这大约需要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文档中的