<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ⅴ大香| 久久亚洲AV无码精品色午夜麻豆| 国内精品99亚洲免费高清| 成人免费a级毛片| 99亚偷拍自图区亚洲| 十八禁在线观看视频播放免费| 很黄很黄的网站免费的| 亚洲一级特黄大片在线观看| 亚洲黄色免费网址| 猫咪免费人成网站在线观看| 日韩精品成人亚洲专区| 亚洲国产一区二区三区青草影视| 亚洲а∨天堂久久精品9966| 日韩精品视频免费网址| 国产成人亚洲综合无码精品| 国产 亚洲 中文在线 字幕| 国产高清在线精品免费软件| 久久精品国产亚洲AV无码偷窥| 日韩毛片免费一二三| 日本免费一区二区在线观看| 亚洲国产精华液网站w| 久久久久久毛片免费播放| 国产午夜亚洲精品午夜鲁丝片 | 两个人日本WWW免费版| 久久精品亚洲一区二区 | 亚洲综合校园春色| 国产一区二区三区免费看| 亚洲激情视频网站| a级毛片视频免费观看| 亚洲视频免费在线看| 午夜免费不卡毛片完整版| 91亚洲国产成人久久精品网址| a视频在线免费观看| 亚洲一区精品视频在线| 成人浮力影院免费看| 色欲aⅴ亚洲情无码AV蜜桃| 91久久成人免费| 偷自拍亚洲视频在线观看99|