2012-02-16 105 views
0

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

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

现在我的代码生成一个约6000个这样的域对象的数组,然后每个save它。这全部在withTransaction之内。

这需要大约10秒钟来保存。 HSQLDB内存数据源中的数字稍差一些。我已经尝试了关于刷新会话等的指示,但这些只会增加所需的时间。

加快这6000个物体的批量插入的最佳解决方案是什么?会放弃GORM并直接编写SQL插入语句显着更快?

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

回答

0

CSV import是一个非常重要的用例。 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文档中的Application Profiling