閱讀了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;
1public Session openSession(){
2
3 return getHibernateTemplate().getSessionFactory().openSession();
4
5 }然後,用打開的Session處理你的數據;
1protected 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
至於處理速度呢,不會慢到哪兒去的,已經試驗過了。; - )
還等什麼,趕快試試吧!