程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Hibernate大數據量操作解決方案

Hibernate大數據量操作解決方案

編輯:關於JAVA

閱讀了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

至於處理速度呢,不會慢到哪兒去的,已經試驗過了。; - )

還等什麼,趕快試試吧!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved