閱讀了Hibernate的Reference之後可以采用批量處理的方法當插入的數據超過時就flush session並且clear
下面是一個測試method
/** */ /**
* 測試成批插入數據的事務處理返回是否成功
*
* @param objPO Object
* @return boolean
*/
public boolean insertBatch( final Object objPO) {
boolean isSuccess = false ;
Transaction transaction = null ;
Session session = openSession();
try {
transaction = sessionbeginTransaction();
for ( int i = ; i < ; i ++ ) {
sessionsave(objPO);
if (i % == ) {
// flush a batch of inserts and release memory
sessionflush();
sessionclear();
}
}
mit();
( transactionwasCommitted:
+ transactionwasCommitted());
isSuccess = true ;
} catch (HibernateException ex) {
if (transaction != null ) {
try {
transactionrollback();
loggererror( transactionwasRolledBack:
+ transactionwasRolledBack());
} catch (HibernateException ex) {
loggererror(exgetMessage());
exprintStackTrace();
}
}
loggererror( Insert Batch PO Error: + exgetMessage());
exprintStackTrace();
} finally {
if (transaction != null ) {
transaction = null ;
}
sessionclose();
}
return isSuccess;
}
這只是簡單的測試實際項目中遇到的問題要比這個復雜得多
這時候我們可以讓Spring來控制Transaction自己來控制Hibernate的Session隨時更新數據
首先利用HibernateDaoSupport類來自定義個方法打開Session
public Session openSession(){
return getHibernateTemplate()getSessionFactory()openSession();
}然後用打開的Session處理你的數據
protected void doBusiness(Session session) {
while (true) {
//do your business with the opening session
someMethod(session);
sessionflush();
sessionclear();
(good job!);
}
}
每做一次數據操作就更新一次Session這樣可以保證每次數據操作都成功否則就讓Spring去控制 它roll back吧
最後記得關閉Session
Session session = openSession();
doBusiness(session);
sessionclose(); // 關閉session
至於處理速度呢不會慢到哪兒去的已經試驗過了; )
還等什麼趕快試試吧!
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28270.html