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