2012-01-19 52 views
3

我想用Hibernate在數據庫中保存多條記錄,但我認爲我的方法是錯誤的。因爲如果記錄增加,它會創建性能問題。用Hibernate在數據庫中保存多條記錄

我想在數據庫存儲一樣,

FirstName   LastName 
FNameABC   LNameCC   
FNamePQR   LNameDD   
FNameXYZ   LNameEE 

我存儲在數據庫上面的值,

Iterator itr = list.Iterator(); 
while(itr.hasNext()) { 
    Test t = (Test)itr.next(); 
    dbEntity.setFirstName(t.setFirstName()); 
    dbEntity.setLastName(t.setLastName()); 
    session.beginTransaction(); 
    session.save(dbEntity); 
    session.getTransaction().commit(); 
    session.close(); 
} 

在這裏我保存在一個循環內seession值。所以每次記錄都會調用beginTransaction(),save(),commit()。 有沒有更好的方法?

+0

你確定每個插入都應該在單獨的事務中完成嗎? –

回答

3

請看看這個頁面:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html

您應該打開一個交易,保存(在環)的實體,在最後提交事務並關閉會話。 建議您可以在循環時使用計數器,並在達到特定數量後進行閃爍/清理會話 - 定期進行。

+0

在大量實體中使用此方法時,需要定期刷新和清除會話。骯髒檢查大量實體很快成爲瓶頸。 –

+0

取決於案件,實體數量,公開會話的數量......如果案件不會發生,有時不值得實施複雜的解決方案。我的回答只是針對特定的情況。我同意在極端情況下應考慮不同的方法。 –

+0

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html –

2

根據技術或性能考慮,您不會選擇啓動和提交事務。您選擇基於您認爲應該原子,連貫地完成並與其他交易分開進行。閱讀http://en.wikipedia.org/wiki/ACID

如果你想確保所有的插入成功或失敗,但你不應該處於一半成功而另一半失敗的狀態,那麼你的事務應該封裝所有的插入:你啓動在第一個之前交易,並在最後一個之後提交。

相反,如果您希望每個插入操作在其自己的事務中完成,例如,如果一個失敗但能夠coninue插入其他事務時能夠捕獲異常,那麼每個插入應該在其自己的事務中完成,就像你在做什麼一樣。

相關問題