posts - 31,  comments - 31,  trackbacks - 0

          程序功能:
          使用hibernate+spring將oracle數(shù)據(jù)庫中的tfile表中的數(shù)據(jù)抽取到db2數(shù)據(jù)庫的tfile表,這兩個表的結(jié)構(gòu)相同。(原本要使用一些Spring的特性,但是程序改來改去發(fā)現(xiàn)Spring特性一個都沒用上,實際上完全可以由hibernate創(chuàng)建兩個sessionFactory完成)
          測試環(huán)境:
          celeron M 1.4/512M/mysql 5.0數(shù)據(jù)庫
          代碼:

          public void save() {
            Session session
          = fileDAO.getDataSession();
            Session session2
          = fileDAO2.getDataSession();
            Transaction tx 
          =session2.beginTransaction();
            
          int count=0;
            List list 
          =fileDAO.getList(session, count);
            
          while(list.size()!=0)
            
          {
             
          for(int i=0,num =list.size();i<num;i++)
             
          {
              session2.save(list.get(i));
              session.evict(list.get(i));
              
          if(num%50==0)
              
          {
               session2.flush();
               session2.clear();
              }

             }

             count
          = count+500;
             list 
          =fileDAO.getList(session, count);
             
            
          // System.out.println(count);
             
            }

            tx.commit();
            session.close();
            session2.close();
          }

          配置文件:

          <prop key="hibernate.jdbc.batch_size">50</prop>
          <prop key="hibernate.cache.use_second_level_cache">false</prop>

           

          1、為保證不會出現(xiàn)內(nèi)存溢出
             hibernate.jdbc.batch_size 設(shè)為 20-50
             并在代碼中沒隔50個insert后手工清理數(shù)據(jù) 
               

           if(num%50==0)
              
          {
               session2.flush();
               session2.clear();
              }

          2、為保證減少二級緩存導(dǎo)致的過多的內(nèi)存開銷關(guān),閉二級緩存
            hibernate.cache.use_second_level_cache 設(shè)為false
          3、保證使用長事務(wù),不要在每個插入都事務(wù)提交,這樣性能可以有很大幅度的提升(由于原先配的事務(wù)沒有正常運(yùn)行,在初次測試時此程序插入4萬條數(shù)據(jù)用了12分鐘,使用了長事務(wù)后僅為34秒)
          4、使用ScrollableResults(提供了數(shù)據(jù)庫的游標(biāo)特性)然后插入的效果好像要優(yōu)于分批抓取分批插入的效果,(4萬條數(shù)據(jù),用ScrollableResult耗時29秒)但網(wǎng)上有人聲稱批量抓取插入的效果要好可能在遠(yuǎn)程數(shù)據(jù)庫的情況下批量抓取的可靠性更高一點的原因。這一點我詢問過公司里做數(shù)據(jù)庫比較好的人,批量處理數(shù)據(jù)是要使用游標(biāo)處理的。就游標(biāo)而言分為動態(tài)游標(biāo),靜態(tài)游標(biāo),動態(tài)游標(biāo)慢于靜態(tài)游標(biāo),靜態(tài)游標(biāo)慢于靜態(tài)查詢,但是如果用分批抓取數(shù)據(jù)的話就涉及到數(shù)據(jù)分段截取,為保證每次分段截取時數(shù)據(jù)的正確性,應(yīng)該要預(yù)先對數(shù)據(jù)處理,所以批量抽取數(shù)據(jù)的速度可能會慢一些。以下為使用ScrollableResult的程序
            

          Session session= fileDAO.getDataSession();
            Session session2
          = fileDAO2.getDataSession();
            Transaction tx 
          =session2.beginTransaction();
            ScrollableResults tFiles 
          = session.createQuery(
              
          "from TFile as model ").setCacheMode(CacheMode.IGNORE).scroll(ScrollMode.FORWARD_ONLY);
            
          int count=0;
            
          while(tFiles.next())
            
          {
             session2.save(tFiles.get(
          0));
             
          if(++count%50==0)
              
          {
               session2.flush();
               session2.clear();
              }

            }

            tx.commit();
            session.close();
            session2.close();
          posted on 2007-04-24 19:30 小平 閱讀(1803) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          framework

          j2me

          java

          linux

          web

          其他

          友情鏈接

          素材

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 遵义县| 宣城市| 和林格尔县| 岢岚县| 巍山| 孝感市| 弋阳县| 广安市| 大埔区| 尚志市| 盐津县| 板桥市| 陈巴尔虎旗| 于都县| 县级市| 永宁县| 台东县| 阿克陶县| 西畴县| 犍为县| 招远市| 长丰县| 银川市| 营山县| 泗阳县| 甘德县| 大埔县| 禄劝| 丰都县| 乌拉特中旗| 德令哈市| 霍山县| 拉萨市| 河津市| 南召县| 高台县| 阿克陶县| 峨边| 芜湖市| 浦东新区| 江陵县|