阅读了Hibernate的Reference之后,可以采用批量处理的方法,当插入的数据超过10000时,就flush session并且clear。
下面是一个测试method。
1 /** *//** 2 * 测试成批插入数据的事务处理,返回是否成功 3 * 4 * @param objPO Object 5 * @return boolean 6 */ 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 memory 17 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;
1 public Session openSession() { 2 3 return getHibernateTemplate().getSessionFactory().openSession(); 4 5 }
然后,用打开的Session处理你的数据;
1 protected void doBusiness(Session session) { 2 3 while (true) { 4 //do your business with the opening session 5 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
至于处理速度呢,不会慢到哪儿去的,已经试验过了。; - )
还等什么,赶快试试吧!
THE END
|