熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Hibernate大數據量操作方案

2013-11-23 20:18:49  來源: Java開源技術 

  閱讀了Hibernate的Reference之後可以采用批量處理的方法當插入的數據超過就flush session並且clear

  下面是一個測試method

    /** */ /**

     * 測試成批插入數據的事務處理返回是否成功

     *

     * @param objPO Object

     * @return boolean

      */

      public  boolean insertBatch( final Object objPO)  {

       boolean isSuccess =  false ;

       Transaction transaction =  null ;

       Session session = openSession();

        try  {

         transaction = sessionbeginTransaction();

          for ( int i =  ; i <  ; i ++ )  {

           sessionsave(objPO);

            if (i %    ==  )  {

             // flush a batch of inserts and release memory

             sessionflush();

             sessionclear();

           }

         }

         mit();

         ( transactionwasCommitted:

             + transactionwasCommitted());

         isSuccess =  true ;

       }  catch (HibernateException ex)  {

          if (transaction !=  null )  {

            try  {

             transactionrollback();

             loggererror( transactionwasRolledBack:

                 + transactionwasRolledBack());

           }  catch (HibernateException ex)  {

             loggererror(exgetMessage());

             exprintStackTrace();

           }

         }

         loggererror( Insert Batch PO Error:   + exgetMessage());

         exprintStackTrace();

       }  finally  {

          if (transaction !=  null )  {

           transaction =  null ;

         }

         sessionclose();

       }

       return isSuccess;

     }

  

  這只是簡單的測試實際項目中遇到的問題要比這個復雜得多

  這時候我們可以讓Spring來控制Transaction自己來控制Hibernate的Session隨時更新數據

  首先利用HibernateDaoSupport類來自定義個方法打開Session

  public Session openSession(){

  

      return getHibernateTemplate()getSessionFactory()openSession();

  

    }然後用打開的Session處理你的數據

  protected void doBusiness(Session session) {

  

      while (true) {

        //do your business with the opening session

        someMethod(session);

        sessionflush();

        sessionclear();

        (good job!);

      }

  }

  每做一次數據操作就更新一次Session這樣可以保證每次數據操作都成功否則就讓Spring去控制 它roll back吧

  最後記得關閉Session

   Session session = openSession();

   doBusiness(session);

   sessionclose(); // 關閉session

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

  還等什麼趕快試試吧!


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28270.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.