|
閱讀了Hibernate的Reference之后,可以采用批量處理的方法,當插入的數(shù)據(jù)超過10000時,就flush session并且clear。
下面是一個測試method。
1 /** *//** 2 * 測試成批插入數(shù)據(jù)的事務處理,返回是否成功 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,隨時更新數(shù)據(jù)。 首先,利用HibernateDaoSupport類來自定義個方法打開Session;
1 public Session openSession() { 2 3 return getHibernateTemplate().getSessionFactory().openSession(); 4 5 }
然后,用打開的Session處理你的數(shù)據(jù);
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 }
每做一次數(shù)據(jù)操作,就更新一次Session,這樣可以保證每次數(shù)據(jù)操作都成功,否則就讓Spring去控制它roll back吧。
最后,記得關閉Session。
1 Session session = openSession(); 2 doBusiness(session); 3 session.close(); // 關閉session
至于處理速度呢,不會慢到哪兒去的,已經(jīng)試驗過了。; - )
還等什么,趕快試試吧!
THE END
|