如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

          CowNew開源團(tuán)隊(duì)

          http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

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

          評(píng)論

          # re: 數(shù)據(jù)導(dǎo)入優(yōu)化經(jīng)驗(yàn) 2006-03-08 12:08 ddd
          改ImportDataFactory.getInstance()讓返回一個(gè)decorated的接口不就行了.  回復(fù)  更多評(píng)論
            

          # re: 數(shù)據(jù)導(dǎo)入優(yōu)化經(jīng)驗(yàn) 2006-03-08 12:36 Java & Delphi 聯(lián)合王國(guó)
          @ddd
          ImportDataFactory類是公司的開發(fā)工具自動(dòng)生成的,不能改,即使改了再次生成的時(shí)候也會(huì)被重新覆蓋改成默認(rèn)的形式,呵呵.所以只能這樣做了
            回復(fù)  更多評(píng)論
            

          # re: 數(shù)據(jù)導(dǎo)入優(yōu)化經(jīng)驗(yàn) 2006-03-09 09:23 insert&&modify
          把它緩存起來(lái),等所有插入語(yǔ)句執(zhí)行完畢后將緩存的sql語(yǔ)句一次性提交到我定義的一個(gè)新的接口方法中?
          搞不明白,你這里把它緩存起來(lái),那就是說(shuō)不和數(shù)據(jù)庫(kù)交互了,你怎么保證事務(wù)啊?
            回復(fù)  更多評(píng)論
            

          # re: 數(shù)據(jù)導(dǎo)入優(yōu)化經(jīng)驗(yàn) 2006-03-10 09:40 scorpional
          弱弱的問(wèn)一句,你的提交方法里面是不是就是做commit動(dòng)作,但是這樣沒有立刻提交,能保證事務(wù)么?  回復(fù)  更多評(píng)論
            

          # re: 數(shù)據(jù)導(dǎo)入優(yōu)化經(jīng)驗(yàn) 2006-03-10 20:12 Java & Delphi 聯(lián)合王國(guó)
          我執(zhí)行的都是insert語(yǔ)句,在批量執(zhí)行之前開始事務(wù),執(zhí)行完畢commit,執(zhí)行錯(cuò)誤就rollback,肯定能保證事務(wù)呀。難道我做的有什么不妥?請(qǐng)指教。
          示意性代碼:

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

          # re: 數(shù)據(jù)導(dǎo)入優(yōu)化經(jīng)驗(yàn) 2006-03-11 10:10 scorpional
          哦,明白了,學(xué)習(xí)!  回復(fù)  更多評(píng)論
            

          # re: 數(shù)據(jù)導(dǎo)入優(yōu)化經(jīng)驗(yàn) 2006-06-02 16:01 霉干菜
          定義一個(gè)ImportDataDecorate類,讓他也實(shí)現(xiàn)IImportDataFacade接口,它的executeSQL實(shí)現(xiàn)不是吧sql提交到數(shù)據(jù)庫(kù),而是把它緩存起來(lái),等所有插入語(yǔ)句執(zhí)行完畢后將緩存的sql語(yǔ)句一次性提交到我定義的一個(gè)新的接口方法中(此方法含有一個(gè)sql數(shù)組的發(fā)那個(gè)法),這樣就可以保證事務(wù)和速度了。


          這個(gè)時(shí)候?yàn)槭裁床恢苯臃植继峤荒?而是再用一個(gè)方法合并sql數(shù)組 和sql語(yǔ)句呢,我感覺這部分合并不用去創(chuàng)建一個(gè)新的接口方法把? 還是照你這樣作才能提高效率呢?
          請(qǐng)指教.  回復(fù)  更多評(píng)論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 福州市| 集贤县| 罗田县| 旅游| 林芝县| 新化县| 玉屏| 富锦市| 来宾市| 康乐县| 舒兰市| 鹿邑县| 宣汉县| 五指山市| 中阳县| 齐齐哈尔市| 梁山县| 含山县| 绩溪县| 曲周县| 玉门市| 曲麻莱县| 五寨县| 贵南县| 凌云县| 武平县| 高清| 丹棱县| 和龙市| 嘉荫县| 金川县| 黑龙江省| 都匀市| 大城县| 湘阴县| 新宾| 杭锦后旗| 天柱县| 海南省| 兴义市| 盐边县|