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

          主站蜘蛛池模板: 原平市| 松滋市| 莎车县| 黄冈市| 凤台县| 阿克苏市| 新龙县| 高清| 商丘市| 德庆县| 石狮市| 上林县| 汉源县| 随州市| 姚安县| 建始县| 丽水市| 右玉县| 察哈| 吐鲁番市| 平山县| 通道| 正安县| 淄博市| 阳高县| 拉孜县| 郯城县| 枣庄市| 乐都县| 绍兴县| 南部县| 张家川| 木兰县| 增城市| 晋城| 神池县| 南汇区| 莱西市| 方城县| 怀集县| 济宁市|