posts - 195, comments - 34, trackbacks - 0, articles - 1

          JDBC優(yōu)化策略總結(jié)zz

          Posted on 2009-11-14 19:18 小強(qiáng)摩羯座 閱讀(176) 評論(0)  編輯  收藏 所屬分類: Java
          JDBC優(yōu)化策略總結(jié)
          相比Hibernate、iBatis、DBUtils等,理論上JDBC的性能都超過它們。JDBC提供更底層更精細(xì)的數(shù)據(jù)訪問策略,這是Hibernate等框架所不具備的。

            在一些高性能的數(shù)據(jù)操作中,越高級的框架越不適合使用。這里是我在開發(fā)中對JDBC使用過程中一些優(yōu)化經(jīng)驗總結(jié)。

            1、選擇純Java的JDBC驅(qū)動。

            2、使用連接池--使用一個“池”來管理JDBC連接,并精心調(diào)試池配置的參數(shù),目前可用的數(shù)據(jù)庫連接池很多很多。

            如何配置合適的參數(shù)呢,需要的是測試,而不是感覺。

            3、重用Connection--最大限度使用每個數(shù)據(jù)庫連接,得到了就不要輕易“丟棄”。

            有時候在一個過程中,會多次操作數(shù)據(jù)庫,而僅僅需要一個連接就夠了,沒必用一次就獲取一個連接,用完后關(guān)閉或者入池。這樣會增加“池”管理的成本,千萬別以為你用了“池”就可以隨便申請和歸還連接,都是有代價的。如果是一個龐大循環(huán)塊中操作數(shù)據(jù)庫,更應(yīng)該注意此問題!

            4、重用Statement--對于一些預(yù)定義SQL,設(shè)置為靜態(tài)常量,并盡可能重用預(yù)定義SQL產(chǎn)生的PreparedStatement對象。對于多次使用一種模式的SQL,使用預(yù)定義SQL可以獲取更好的性能。

            5、使用批處理SQL。

            6、優(yōu)化結(jié)果集ResultSet--查詢時候,返回的結(jié)果集有不同的類型,優(yōu)先選擇只讀結(jié)果集、不可滾動的屬性。

            這里是很容易出現(xiàn)問題的地方:

          java.sql.ResultSet

          static int CLOSE_CURSORS_AT_COMMIT    
                              該常量指示調(diào)用 Connection.commit 方法時應(yīng)該關(guān)閉 ResultSet 對象。    
          static int CONCUR_READ_ONLY    
                              該常量指示不可以更新的 ResultSet 對象的并發(fā)模式。    
          static int CONCUR_UPDATABLE    
                              該常量指示可以更新的 ResultSet 對象的并發(fā)模式。    
          static int FETCH_FORWARD    
                              該常量指示將按正向(即從第一個到最后一個)處理結(jié)果集中的行。    
          static int FETCH_REVERSE    
                              該常量指示將按反向(即從最后一個到第一個)處理結(jié)果集中的行處理。    
          static int FETCH_UNKNOWN    
                              該常量指示結(jié)果集中的行的處理順序未知。    
          static int HOLD_CURSORS_OVER_COMMIT    
                              該常量指示調(diào)用 Connection.commit 方法時不應(yīng)關(guān)閉 ResultSet 對象。    
          static int TYPE_FORWARD_ONLY    
                              該常量指示指針只能向前移動的 ResultSet 對象的類型。    
          static int TYPE_SCROLL_INSENSITIVE    
                              該常量指示可滾動但通常不受其他的更改影響的 ResultSet 對象的類型。    
          static int TYPE_SCROLL_SENSITIVE    
                              該常量指示可滾動并且通常受其他的更改影響的 ResultSet 對象的類型。
           
            說明下:

            結(jié)果集分兩種類型:只讀和可更改,只讀的話,更省內(nèi)存,查詢的結(jié)果集不能更改。如果結(jié)果集在查詢后,更改了值又要保存,則使用可更改結(jié)果集。

            結(jié)果集的游標(biāo)也有兩種類型:如果沒必要讓游標(biāo)自由滾動,則選擇單方向移動的游標(biāo)類型。

            對于是否并發(fā)操作:如果不需要考慮線程安全,則選擇忽略并發(fā)的結(jié)果集類型,否則選擇并發(fā)安全的類型。

            另外,還要控制結(jié)果的大小,幾乎所有的數(shù)據(jù)庫都有查詢記錄條數(shù)控制的策略,可以海量數(shù)據(jù)進(jìn)行分批處理,一次一批,這樣不至于把系統(tǒng)搞死。

            7、事物優(yōu)化--如果數(shù)據(jù)庫不支持事物,就不要寫回滾代碼,如果不考慮事物,就不要做事務(wù)的控制。

            8、安全優(yōu)化--管理好你的Connection對象,在異常時候能“入池”或者關(guān)閉。因此應(yīng)該將Connection釋放的代碼寫在異常處理的finally塊中。

            9、異常處理優(yōu)化--不要輕易吞噬SQLException,對于DAO、Service層次的數(shù)據(jù)訪問,一般在DAO中跑出異常,在Service中處理異常。但DAO中也可以處理異常,并做轉(zhuǎn)義拋出,不要隨便拋出RuntimeExeption,因為這是JVM拋出的,不需要你可以去拋出,因為RuntimeException往往會導(dǎo)致系統(tǒng)掛起。

            10、代碼高層優(yōu)化--在以上的基礎(chǔ)上,優(yōu)化封裝你的數(shù)據(jù)訪問方式,盡可能讓代碼簡潔好維護(hù),如果你還覺得性能不行,那就該從整個系統(tǒng)角度考慮優(yōu)化了,比如加上緩存服務(wù)器,集群、負(fù)載均衡、優(yōu)化數(shù)據(jù)庫服務(wù)器等等,以獲取更好的系能。

            本文出自 “熔 巖” 博客,請務(wù)必保留此出處http://lavasoft.blog.51cto.com/62575/225828



          主站蜘蛛池模板: 忻州市| 陆丰市| 泾川县| 正安县| 龙川县| 乌鲁木齐县| 迁安市| 苏尼特左旗| 新竹市| 肥东县| 阳新县| 静海县| 神木县| 沅江市| 定陶县| 瓦房店市| 杭州市| 额济纳旗| 宁蒗| 东乡族自治县| 进贤县| 固安县| 乐山市| 额济纳旗| 贡嘎县| 舒城县| 安岳县| 五寨县| 临清市| 延川县| 通榆县| 庆云县| 华宁县| 通道| 壶关县| 奈曼旗| 宜城市| 襄樊市| 浮梁县| 逊克县| 介休市|