2014-10-22 28 views
0

我已經讀了很多從一個CSV文件中的數據,我現在需要在數據庫中存儲的,我這樣做這樣一個級聯保存:聖盃2.4.3 AddTo就內存泄漏問題

class saveData() { 

def data = session.getAttribute("Data") 

def dataInfo = new DataInfo(firstName: params.firstName, lastName: params.lastName, email: params.email) 

    data.collect{ 
     .addToCustomerDetails(new dataCustomerInfo(number: it[0], email: it[1], email: it[2])) 
     .save(flush:true) 
    } 

    if (dataInfo.validate()) { 
     redirect(action: "list", id: dataInfo.id) 
    } 
} 

數據集可能是一百萬行,第一千個左右都很好,但事情開始放緩,最終我放棄了。用戶可能有15分鐘的寬限期超時登錄,但此過程似乎需要30分鐘才能完成25,000行?

當使用如此大量的數據時,進程AddTo是最高效的嗎?

回答

0

我不這麼認爲,你應該在這裏使用雙目錄一對多。預計不會有數百萬的參考文獻。 所以第一,使用uni-dir o2m與belongsTo,沒有任何限制。

其次,你正面臨着一個典型的hibernate gotcha batch updates,它與bi-dir o2m一起導致會話溢出。您應該每沖洗1k行左右沖洗會話:

int count = 0 
data.each{ 
    new dataCustomerInfo(number: it[0], email: it[1], email: it[2], dataInfo:dataInfo) 
     .save(flush:0 == count % 1000) 
} 

P.S.你的域名類名是否真的以小寫開頭?

+0

再次感謝,我似乎無法得到級聯保存正確...我得到數據庫中的數據,但它並沒有創建正確的DataInfo索引,它只是插入數據。 – NewbieGrails 2014-10-22 13:32:11