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

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

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

    如鵬網 大學生計算機學習社區

    CowNew開源團隊

    http://www.cownew.com 郵件請聯系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks
          今天改完了bug就開始考慮起怎么優化數據導入的程序了。我們的系統構架要求客戶端不能執行sql語句,所有的數據庫操作都要通過ejb來實現。我這個數據導入就麻煩了,因為是大量數據的導入,如果采用ejb的方式一條一條的導入,速度會很慢。
        所以我采取了定義一個SessionBean,在SessionBean中定義一個executeSQL方法,接受兩個參數,一個是sql語句(可能帶參數),和一個參數值數組。這樣客戶端就可以直接通過sql語句操縱數據庫了。但是問題也就來了,如果每條數據都調用executeSQL訪問一次數據庫,這樣不僅會造成頻繁的事務啟動,速度很慢,而且由于各個數據庫插入操作之間是在不同的ejb調用中進行的,所以無法保證事務。我優化的重點當然也就在這兩點上。項目緊急,我不能對構架做太大的改動了,因為畢竟以前的實現方式可以導入數據了,我就琢磨著在不做大規模改動的情況下進行優化,將風險降低到最小。
        系統中所有ejb都是基于接口的,比如上邊定義的executeSQL方法就定義在IImportDataFacade接口中,ejb實現這個接口,客戶端通過工廠方法ImportDataFactory.getInstance()訪問這個接口(ImportDataFactory.getInstance()返回IImportDataFacade類型)。好,我就從他下手。定義一個ImportDataDecorate類,讓他也實現IImportDataFacade接口,它的executeSQL實現不是吧sql提交到數據庫,而是把它緩存起來,等所有插入語句執行完畢后將緩存的sql語句一次性提交到我定義的一個新的接口方法中(此方法含有一個sql數組的發那個法),這樣就可以保證事務和速度了。
        我是怎么實現對系統改動最小呢?對了,我只要把所有調用ImportDataFactory.getInstance().executeSQL()的地方替換成new ImportDataDecorate(ImportDataFactory.getInstance()).executeSQL(),哈哈,改動很小吧,而且一旦發現這種實現方式不可行,那么只要將ImportDataDecorate.executeSQL()的實現改成直接提交到數據庫就好了,其他調用根本不用變。設計模式很偉大呀,只不過我都不知道我用的這是什么模式,Proxy 還是Decorator?不知道,反正解決問題了,呵呵。
    posted on 2006-03-07 22:08 CowNew開源團隊 閱讀(1001) 評論(7)  編輯  收藏

    評論

    # re: 數據導入優化經驗 2006-03-08 12:08 ddd
    改ImportDataFactory.getInstance()讓返回一個decorated的接口不就行了.  回復  更多評論
      

    # re: 數據導入優化經驗 2006-03-08 12:36 Java & Delphi 聯合王國
    @ddd
    ImportDataFactory類是公司的開發工具自動生成的,不能改,即使改了再次生成的時候也會被重新覆蓋改成默認的形式,呵呵.所以只能這樣做了
      回復  更多評論
      

    # re: 數據導入優化經驗 2006-03-09 09:23 insert&&modify
    把它緩存起來,等所有插入語句執行完畢后將緩存的sql語句一次性提交到我定義的一個新的接口方法中?
    搞不明白,你這里把它緩存起來,那就是說不和數據庫交互了,你怎么保證事務啊?
      回復  更多評論
      

    # re: 數據導入優化經驗 2006-03-10 09:40 scorpional
    弱弱的問一句,你的提交方法里面是不是就是做commit動作,但是這樣沒有立刻提交,能保證事務么?  回復  更多評論
      

    # re: 數據導入優化經驗 2006-03-10 20:12 Java & Delphi 聯合王國
    我執行的都是insert語句,在批量執行之前開始事務,執行完畢commit,執行錯誤就rollback,肯定能保證事務呀。難道我做的有什么不妥?請指教。
    示意性代碼:

    beginTX();
    try
    {
    for(int i=0,n=sqlcache.size();i<n;i++)
    {
    executeSQL(sqlcache.get(i));
    }
    commit();
    }
    catch
    {
    rollbakc();
    }  回復  更多評論
      

    # re: 數據導入優化經驗 2006-03-11 10:10 scorpional
    哦,明白了,學習!  回復  更多評論
      

    # re: 數據導入優化經驗 2006-06-02 16:01 霉干菜
    定義一個ImportDataDecorate類,讓他也實現IImportDataFacade接口,它的executeSQL實現不是吧sql提交到數據庫,而是把它緩存起來,等所有插入語句執行完畢后將緩存的sql語句一次性提交到我定義的一個新的接口方法中(此方法含有一個sql數組的發那個法),這樣就可以保證事務和速度了。


    這個時候為什么不直接分布提交呢,而是再用一個方法合并sql數組 和sql語句呢,我感覺這部分合并不用去創建一個新的接口方法把? 還是照你這樣作才能提高效率呢?
    請指教.  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 美女网站在线观看视频免费的 | 亚洲国产成人a精品不卡在线| 99精品全国免费观看视频| 99在线视频免费观看视频| 国产资源免费观看| 在线观看国产区亚洲一区成人| 日本亚洲成高清一区二区三区| 亚洲黄色在线视频| 亚洲av无码一区二区三区天堂| 国产精品亚洲а∨无码播放不卡| 男人j进女人p免费视频| 2021在线观看视频精品免费| 四虎影视精品永久免费网站| 久久国产亚洲精品麻豆| 国内精品一级毛片免费看| 色播在线永久免费视频| 亚洲成AV人片一区二区密柚| 久久国产乱子伦精品免费一| 免费国产综合视频在线看| 亚洲视频在线观看网站| 99久久精品日本一区二区免费 | 亚洲精品久久久www| 亚洲白嫩在线观看| 日韩电影免费在线观看网址| 亚洲а∨天堂久久精品| 国内永久免费crm系统z在线| 免费大黄网站在线观| 72pao国产成视频永久免费| 国产精品四虎在线观看免费| 边摸边吃奶边做爽免费视频网站| 最近最新的免费中文字幕| 亚洲国产成人手机在线电影bd| 国产99视频精品免费视频76| 亚洲ⅴ国产v天堂a无码二区| 国产精品小视频免费无限app| 亚洲福利在线观看| 国产午夜影视大全免费观看| 国产一级a毛一级a看免费人娇| 伊人久久综在合线亚洲91| 亚洲免费闲人蜜桃| 亚洲成人午夜电影|