阅读了Hibernate的Reference之后,可以采用批量处理的方法,当插入的数据超过10000时,就flush session并且clear。
下面是一个测试method。
* 测试成批插入数据的事务处理,返回是否成功
public boolean insertBatch( final Object objPO) {
boolean isSuccess = false ;
Transaction transaction = null ;
Session session = openSession();
try {
transaction = session.beginTransaction();
for ( int i = 0 ; i < 100000 ; i ++ ) {
session.save(objPO);
if (i % 50 == 0 ) {
// flush a batch of inserts and release memory
session.flush();
session.clear();
}
}
transaction.commit();
logger.info( " transaction.wasCommitted: "
+ transaction.wasCommitted());
isSuccess = true ;
} catch (HibernateException ex) {
if (transaction != null ) {
try {
transaction.rollback();
logger.error( " transaction.wasRolledBack: "
+ transaction.wasRolledBack());
} catch (HibernateException ex1) {
logger.error(ex1.getMessage());
ex1.printStackTrace();
}
}
logger.error( " Insert Batch PO Error: " + ex.getMessage());
ex.printStackTrace();
} finally {
if (transaction != null ) {
transaction = null ;
}
session.close();
}
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);
session.flush();
session.clear();
logger.info("good job!");
}
}
每做一次数据操作,就更新一次Session,这样可以保证每次数据操作都成功,否则就让Spring去控制它roll back吧。
最后,记得关闭Session。
Session session
=
openSession();
doBusiness(session);
session.close(); // 关闭session
doBusiness(session);
session.close(); // 关闭session