<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 31,  comments - 31,  trackbacks - 0
            到一個這東西都寫到3了,針對上回說到30000條數(shù)據(jù)的批量插入工作。30000條數(shù)據(jù)的批量插入在一個事務(wù)里處理固然是快,但是這只是測試環(huán)境,30000條數(shù)據(jù)在數(shù)據(jù)庫的緩存里必然對數(shù)數(shù)據(jù)庫的緩存和鎖數(shù)量都是一個大的挑戰(zhàn),固在新的程序中我們使用了分批事務(wù)提交的方式,這樣為了保持數(shù)據(jù)的正確行就只能人為控制數(shù)據(jù)庫中已被插入的數(shù)據(jù)是否delete掉。另外,使用Batch塊提交會引發(fā)一個問題就是,如果batch塊中發(fā)生了異常,我們得不到異常數(shù)據(jù)的行號即任何信息,所以只能是魚和熊掌不可兼得(我已關(guān)注過insert方法中返回pk的方法了,但好像在batch中他反回不了出錯的行號,也許是我沒有找到方法,如有人有好方法請共享一下,在這里表示感謝),大家酌情考慮吧,只能到到自己需要的平衡點了。
          建議:如果對數(shù)據(jù)的準確性毋庸置疑的話就是用batch處理。如果不能確定準確性的話,如果對那條數(shù)據(jù)出錯無所謂的話就也可以用batch,但是非要返回出錯行號的話就不要用batch了,直接在外面套用一個事務(wù),然后try catch一下,處理一下行號。
    posted @ 2007-06-28 21:32 小平 閱讀(3291) | 評論 (4)編輯 收藏
    今天發(fā)生了ORA-01461 :can bind a LONG value only for insert into a LONG ...到處查詢發(fā)現(xiàn)是一個字段中的中文內(nèi)容導(dǎo)致,仔細分析了一下原因,是因為jdk1.5的String類型為utf-16編碼方式,而jdk1.4為utf-8,通過在oracle網(wǎng)上查詢10g的jdbc驅(qū)動有兩個版本,舊版的不持jdk1.5,只支持jdk1.4,通過換jdbc驅(qū)動問題解決。
    posted @ 2007-06-20 10:53 小平 閱讀(2803) | 評論 (0)編輯 收藏
    1、上回的心得中我強調(diào)了startBatch()的批處理的作用,但是其中的使用是個錯誤用法,并沒有發(fā)揮出startBatch()的實力,對此給與觀眾的誤導(dǎo)我將在此表示到欠,并貼出正確的用法
    public class LocalDaoImpl extends SqlMapClientDaoSupport implements LocalDao {

        
    public void insertBuNaTaxBatLst(final PaginatedList list)
        
    {
             getSqlMapClientTemplate().execute(
    new SqlMapClientCallback() {
                    
    public Object doInSqlMapClient(SqlMapExecutor executor)
                            
    throws SQLException {
                        executor.startBatch();
                        
    // do some iBatis operations here
                        for(int i=0,count=list.size();i<count;i++)
                        
    {    
                            executor.insert(
    "insertBuNaTaxBatLst", list.get(i));
                            
    if (i % 50 == 0{
                                System.out.println(
    "----" + i);//沒有意義只為測試
                            }

                        }

                        executor.executeBatch();
                        
    return null;
                    }

                }
    );
        }


    }
    這樣才能利用上startBatch()威力。
    2、注意ibatis的事物默認情況下是自動提交的,如果發(fā)現(xiàn)速度上有問題可以留意一下,ibatis只有在顯示的聲明事物管理的情況下才自動將事物管理改為不自動方式。
    3、還是startBatch(),據(jù)我測試分析這個鬼東西只有在executeBatch(),才把所有的語句提交到數(shù)據(jù)庫,在提交之前緩存中保留了大量的sql語句和數(shù)據(jù)對象,很有可能out of memony,對此要留意,可以在大量數(shù)據(jù)要做插入時,分批用Batch,如:有40000條數(shù)據(jù)可將其分為4個Batch塊,讓后將這4個Batch用一個事物提交以保證數(shù)據(jù)完整性。
    注:最近在做數(shù)據(jù)抽取項目,愿與大家溝通心得
    posted @ 2007-05-30 21:46 小平 閱讀(5962) | 評論 (6)編輯 收藏

    程序功能:
    使用ibatis+spring將oracle數(shù)據(jù)庫中的tfile表中的數(shù)據(jù)抽取到db2數(shù)據(jù)庫的tfile表,這兩個表的結(jié)構(gòu)相同。

    測試環(huán)境:
    celeron M 1.4/512M/mysql 5.0數(shù)據(jù)庫
    代碼:

    public static void main(String[] args) {
            
    // TODO Auto-generated method stub
            ClassPathResource resource = new ClassPathResource(
                    
    "applicationContext.xml");
            BeanFactory factory 
    = new XmlBeanFactory(resource);
            TFileDAO tFileDao 
    = (TFileDAO) factory.getBean("tfile");

            TFileDAO test2FileDao 
    = (TFileDAO) factory.getBean("test2tfile");
            
    //獲取全部數(shù)據(jù)
            List list = tFileDao.getAll();
            
    //開啟事務(wù)
            DataSourceTransactionManager txm = (DataSourceTransactionManager) factory
                    .getBean(
    "test2transactionManager");
            DefaultTransactionDefinition def 
    = new DefaultTransactionDefinition();
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
            TransactionStatus status 
    = txm.getTransaction(def);
            
    try {
                test2FileDao.getSqlMapClient().startBatch();
                
    for (int i = 0, count = list.size(); i < count; i++{
                
    //插入數(shù)據(jù)
                    test2FileDao.insert((TFile) list.get(i));
                }

                test2FileDao.getSqlMapClient().executeBatch();// 這兩句有問題,請見Spring+ibatis心得2!
            }
     catch (Exception e) {
                txm.rollback(status);
                System.out.println(e);
            }

            txm.commit(status);
            System.out.println(list.size());
        }
    1、保證使用長事務(wù),不要在每個插入都事務(wù)提交,這樣性能可以有很大幅度的提升
    2、使用 test2FileDao.getSqlMapClient().startBatch();
                  test2FileDao.getSqlMapClient().executeBatch();
                 可以發(fā)起jdbc對批量數(shù)據(jù)插入的優(yōu)化與自動代碼壓縮功能。

          結(jié)語:這次使用ibatis在同樣的硬件、數(shù)據(jù)庫、數(shù)據(jù)條數(shù)的環(huán)境下測試,在不起用batch,所有數(shù)據(jù)庫,數(shù)據(jù)池特性均使用默認設(shè)置情況下使用19秒,并且使用一次性將數(shù)據(jù)讀入內(nèi)存的方式,效果優(yōu)于hibernate,所以真信優(yōu)化后的程序應(yīng)該比hibernate效率更高。但是從程序編寫方面來講,hibernate省去了過多的代碼,可以讓程序員更輕松些。
    posted @ 2007-04-26 19:54 小平 閱讀(3204) | 評論 (1)編輯 收藏

    程序功能:
    使用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ù)沒有正常運行,在初次測試時此程序插入4萬條數(shù)據(jù)用了12分鐘,使用了長事務(wù)后僅為34秒)
    4、使用ScrollableResults(提供了數(shù)據(jù)庫的游標特性)然后插入的效果好像要優(yōu)于分批抓取分批插入的效果,(4萬條數(shù)據(jù),用ScrollableResult耗時29秒)但網(wǎng)上有人聲稱批量抓取插入的效果要好可能在遠程數(shù)據(jù)庫的情況下批量抓取的可靠性更高一點的原因。這一點我詢問過公司里做數(shù)據(jù)庫比較好的人,批量處理數(shù)據(jù)是要使用游標處理的。就游標而言分為動態(tài)游標,靜態(tài)游標,動態(tài)游標慢于靜態(tài)游標,靜態(tài)游標慢于靜態(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 @ 2007-04-24 19:30 小平 閱讀(1800) | 評論 (0)編輯 收藏
    僅列出標題
    共6頁: 上一頁 1 2 3 4 5 6 下一頁 
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    framework

    j2me

    java

    linux

    web

    其他

    友情鏈接

    素材

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 东北美女野外bbwbbw免费| 国产一级淫片a免费播放口之| 亚洲AV无码乱码国产麻豆穿越 | 成在线人直播免费视频| 成年美女黄网站18禁免费| 午夜色a大片在线观看免费| 久久精品亚洲中文字幕无码麻豆 | 亚洲精品人成在线观看| 中文字幕永久免费视频| 亚洲欧洲精品国产区| 可以免费观看的毛片| 亚洲一级片免费看| 国产精品亚洲专区无码WEB| 九九精品免费视频| 亚洲精品mv在线观看| 亚洲 自拍 另类小说综合图区| 中日韩亚洲人成无码网站| 91禁漫免费进入| 四虎在线成人免费网站| 18禁超污无遮挡无码免费网站 | 亚洲性日韩精品国产一区二区| 未满十八18禁止免费无码网站 | 国产va精品免费观看| 亚洲成AV人综合在线观看 | 亚洲自偷自偷在线制服| 一级美国片免费看| 亚洲色成人网站WWW永久| 青青操免费在线视频| 久久亚洲精品成人| 精品国产免费人成电影在线观看| 日韩在线视频线视频免费网站| 亚洲精品日韩中文字幕久久久| 丁香五月亚洲综合深深爱| 午夜国产羞羞视频免费网站| 999久久久免费精品国产| 亚洲成av人在线观看网站| vvvv99日韩精品亚洲| 国产成人A在线观看视频免费| 美美女高清毛片视频黄的一免费 | 日日摸日日碰夜夜爽亚洲| 亚洲成人免费网址|