阅读了Hibernate的Reference之后,可以采用批量处理的方法,当插入的数据超过10000时,就flush session并且clear。
下面是一个测试method。
1 /** */ /**2 * 测试成批插入数据的事务处理,返回是否成功3 *4 * @param objPO Object5 * @return boolean6 */7 public boolean insertBatch( final Object objPO) {8 boolean isSuccess = false ;9 Transaction transaction = null ;10 Session session = openSession();11 try {12 transaction = session.beginTransaction();13 for ( int i = 0 ; i < 100000 ; i ++ ) {14 session.save(objPO);15 if (i % 50 == 0 ) {16 // flush a batch of inserts and release memory17 session.flush();18 session.clear();19 }20 }21 transaction.commit();22 logger.info( " transaction.wasCommitted: "23 + transaction.wasCommitted());24 isSuccess = true ;25 } catch (HibernateException ex) {26 if (transaction != null ) {27 try {28 transaction.rollback();29 logger.error( " transaction.wasRolledBack: "30 + transaction.wasRolledBack());31 } catch (HibernateException ex1) {32 logger.error(ex1.getMessage());33 ex1.printStackTrace();34 }35 }36 logger.error( " Insert Batch PO Error: " + ex.getMessage());37 ex.printStackTrace();38 } finally {39 if (transaction != null ) {40 transaction = null ;41 }42 session.close();43 }44 return isSuccess;45 }46
这只是简单的测试,实际项目中遇到的问题,要比这个复杂得多。
这时候,我们可以让Spring来控制Transaction,自己来控制Hibernate的Session,随时更新数据。
首先,利用HibernateDaoSupport类来自定义个方法打开Session;
1public Session openSession(){2 3 return getHibernateTemplate().getSessionFacTory().openSession();4 5 }然后,用打开的Session处理你的数据;1protected void doBusiness(Session session) {23 while (true) {4 //do your business with the opening session5 someMethod(session);6 session.flush();7 session.clear();8 logger.info("good job!");9 } 10}
每做一次数据操作,就更新一次Session,这样可以保证每次数据操作都成功,否则就让Spring去控制 它roll back吧。
最后,记得关闭Session。
1 Session session = openSession();2 doBusiness(session);3 session.close(); // 关闭session
至于处理速度呢,不会慢到哪儿去的,已经试验过了。; – )
还等什么,赶快试试吧!
你所缺少的部分,也早已被我用想像的画笔填满。