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

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

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

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

          評論

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

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

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

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

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

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

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

          # 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ù)庫,而是把它緩存起來,等所有插入語句執(zhí)行完畢后將緩存的sql語句一次性提交到我定義的一個(gè)新的接口方法中(此方法含有一個(gè)sql數(shù)組的發(fā)那個(gè)法),這樣就可以保證事務(wù)和速度了。


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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 桐乡市| 类乌齐县| 同仁县| 偏关县| 大埔县| 衡南县| 鲁山县| 弥渡县| 九龙县| 同心县| 玛沁县| 无棣县| 邳州市| 冀州市| 通州区| 抚宁县| 台南市| 皮山县| 株洲县| 枞阳县| 大宁县| 江北区| 吕梁市| 改则县| 龙海市| 乐东| 绥宁县| 峨边| 浦城县| 改则县| 黑山县| 钟山县| 阿克陶县| 万载县| 安康市| 黄骅市| 东乌珠穆沁旗| 重庆市| 韩城市| 伊通| 清涧县|