2012-11-30 34 views
4

我必須使用休眠功能將大量對象保存到數據庫中。 而不是立即提交所有的數據,只要n(BATCH_SIZE)對象出現在會話中,我就會提交。如何在hibernate中提交批次的插入操作?

Session session = getSession(); 
session.setCacheMode(CacheMode.IGNORE); 
for(int i=0;i<objects.length;i++){ 
    session.save(objects[i]); 
    if((i+1) % BATCH_SIZE == 0){ 
     session.flush(); 
     session.clear(); 
    } 
} 

我會試着像上面,但我讀了session.flush()不更改提交到數據庫。 這是下面的代碼正確的方法來做到這一點?

Session session = getSession(); 
session.setFlushMode(FlushMode.COMMIT); 
session.setCacheMode(CacheMode.IGNORE); 
session.beginTransaction(); 
for(int i=0;i<objects.length;i++){ 
    session.save(objects[i]); 
    if((i+1) % BATCH_SIZE == 0){ 
     session.getTransaction().commit(); 
     session.clear(); 
     //should I begin a new transaction for next batch of objects? 
     session.beginTransaction(); 
    } 
} 
session.getTransaction().commit(); 
+0

對我很好。您可以保持數據庫事務處於較小狀態,並清除會話緩存,以便您的堆不會充滿分離的實體。當然,您應該簡單地測試一下 - 將事務超時設置爲非常低的數字(例如一分鐘),並讓此代碼保留大量數據並查看代碼是否完成其工作。 – Gimby

回答

0

據我可以告訴你的解決方案是正確的。

可能只有一個問題: 根據您從SessionFactory獲得會話的方式,提交也可能會關閉會話,您將不得不打開一個新會話。據我所知,如果使用getCurrentSession()和會話上下文「thread」,這總是會發生。如果使用openSession(),會話似乎不會自動通過提交來關閉。

提交事務後,您可以使用isOpen()方法輕鬆檢查此事件。如果會話關閉,您必須在再次調用save()之前打開一個新會話。