love fish大鵬一曰同風起,扶搖直上九萬里

          常用鏈接

          統計

          積分與排名

          friends

          link

          最新評論

          Hibernate大數據量操作解決方案(轉)

          閱讀了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處理你的數據;
          ?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


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

          還等什么,趕快試試吧!

          posted on 2007-01-12 15:30 liaojiyong 閱讀(740) 評論(0)  編輯  收藏 所屬分類: Hibernate

          主站蜘蛛池模板: 泰来县| 宁远县| 德清县| 大足县| 万宁市| 高雄市| 临澧县| 广河县| 调兵山市| 云安县| 福州市| 宜章县| 武隆县| 凉山| 惠安县| 吴川市| 大姚县| 黄平县| 静海县| 余姚市| 巴东县| 湘乡市| 仙游县| 北宁市| 曲周县| 常宁市| 高淳县| 临西县| 澄城县| 白河县| 漠河县| 雅江县| 文安县| 苍梧县| 海晏县| 江城| 昆山市| 绍兴市| 庆云县| 彭州市| 苍溪县|