阅读了Hibernate的Reference之后可以采用批量处理的方法当插入的数据超过时就flush session并且clear
下面是一个测试method
/** */ /**
* 测试成批插入数据的事务处理返回是否成功
*
*@paramobjPO Object
*@returnboolean
*/
public booleaninsertBatch( finalObject objPO) {
booleanisSuccess= false ;
Transaction transaction= null ;
Session session=openSession();
try{
transaction=sessionbeginTransaction();
for( inti= ; 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();
}
returnisSuccess;
}
这只是简单的测试实际项目中遇到的问题要比这个复杂得多
这时候我们可以让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
至于处理速度呢不会慢到哪儿去的已经试验过了; )
还等什么赶快试试吧!