使用内存H2数据库进行缓慢批量导入

时间:2012-02-16 04:09:26

标签: hibernate grails h2

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

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

现在我的代码生成一个大约6,000个这些域对象的数组,然后为每个save生成它。这都在withTransaction内。

这需要大约10秒钟才能保存。 HSQLDB内存数据源的数字略差。我已经尝试过关于刷新会话等的说明,但这些只会增加所需的时间。

加速这6000个物体的批量插入的最佳解决方案是什么?放弃GORM并直接编写SQL插入语句要快得多吗?

// data is an array of about 6,000 domain objects
data.each { item ->
    item.save()
}

1 个答案:

答案 0 :(得分:0)

CSV import是一个非常重要的用例。 H2支持快速CSV导入。这很可能比使用工具时更快。

您说“远程下载的CSV文件”。它是临时文件吗?如果是,您可以使用文件中的CSV导入。最快的方法是

CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))
AS SELECT * FROM CSVREAD('test.csv');

这比先创建表然后插入要快。它也比使用批量插入更快。

如果您没有文件但只有输入流,则可以使用new Csv().read(Reader r)直接使用CSV工具,然后从中读取行并将其插入数据库。

当然,您可以尝试通过分析找出瓶颈所在。您可以使用自己的分析器或H2的内置分析器。另请参阅H2文档中的Application Profiling