love fish大鵬一曰同風(fēng)起,扶搖直上九萬里

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          friends

          link

          最新評論

          Hibernate大數(shù)據(jù)量操作解決方案(轉(zhuǎn))

          閱讀了Hibernate的Reference之后,可以采用批量處理的方法,當(dāng)插入的數(shù)據(jù)超過10000時,就flush session并且clear。
          下面是一個測試method。
          ?1/**?*//**
          ?2?????*?測試成批插入數(shù)據(jù)的事務(wù)處理,返回是否成功
          ?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

          這只是簡單的測試,實(shí)際項(xiàng)目中遇到的問題,要比這個復(fù)雜得多。
          這時候,我們可以讓Spring來控制Transaction,自己來控制Hibernate的Session,隨時更新數(shù)據(jù)。

          首先,利用HibernateDaoSupport類來自定義個方法打開Session;
          1 public ?Session?openSession(){
          2????????
          3????????return?getHibernateTemplate().getSessionFactory().openSession();
          4????????
          5????}
          然后,用打開的Session處理你的數(shù)據(jù);
          ?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
          }

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

          最后,記得關(guān)閉Session。

          1 Session?session? = ?openSession();
          2 doBusiness(session);
          3 session.close();? // 關(guān)閉session


          至于處理速度呢,不會慢到哪兒去的,已經(jīng)試驗(yàn)過了。; - )

          還等什么,趕快試試吧!

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

          主站蜘蛛池模板: 南丰县| 鹿泉市| 房产| 吉安县| 徐汇区| 和田市| 大田县| 察雅县| 利川市| 怀安县| 邵阳县| 乌恰县| 北辰区| 依兰县| 高安市| 蒙城县| 监利县| 化州市| 乐平市| 兰溪市| 洪洞县| 永登县| 恩平市| 诸城市| 安溪县| 嘉义市| 吉木萨尔县| 永丰县| 买车| 河南省| 克什克腾旗| 内丘县| 吉首市| 股票| 山东省| 贵定县| 浮山县| 淳安县| 雷山县| 正安县| 道真|