2012-02-16 103 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