posts - 22,comments - 35,trackbacks - 0

          jdbc程序的性能主要由兩個因素決定,一是數據庫本身的性質,另一個是與數據庫相對獨立的jdbc應用程序接口(api)的使用.這里說的是如何正確使用jdbc編程接口,以獲得更好的性能.
            jdbc主要優化有:
               1.選擇正確的jdbc驅動程序
               2.Connention的優化  使用連接池來管理Connection對象
               3.Statement的優化   使用批量更新等
               4.Result的優化  正確的從數據庫中get數據等
              
               (1)選擇正確的jdbc驅動程序:
            1 jdbc-odbc 橋
                      2 本地api-部分 java驅動
                          3 jdbc網路協議-純java驅動
                          4 jdbc本地協議
                          最好選擇 jdbc網路協議-純java驅動  效率比較高  但需要第三方軟件的支持 比如corba  weblogic屬于這種類型
             
               (2)優化Connection對象:
                   1.設置適當的參數  DriverManager.getConnection(String url,Properties props);
                           例如:     Properties props=new Properties();
                props.put("user","wuwei");
                props.put("password","wuwei");
                      props.put("defaultRowPrefectch","30");
                                     props.put("dufaultBatchValue","5");
                                     Connection con=DriverManager.getConnection("jdbc:oracle:thin:@hostsString",props);
                       對象可以通過設置setDefaultRowPrefetch(int) 和 setDefaultBatchValue(int) 兩個參數類優化連接

           2.使用連接池  可以自己寫一個連接池 這樣程序的靈活性強,便于移植.
                apache項目開發了一套非常通用而表現非常穩定的對象池 http://jakarta.apache.org/commons/pool.htm
                設計了自己的連接池后 在客戶端調用建立對象
                                     public Object makeObject() throws Exception{
              Class.forName("oracle.jdbc.driver.OracalDriver");
              return DriverManager.getConnection("url","username","password");
                }
                            銷毀對象時用
                public void destroyObject(Object obj) throws Exception{
                   ((Connection)obj.close());
                }
                  注意幾點 對象池里有沒有回收機制,對象池里有機有容量限制,對象池里有多少個閑置對象(可以釋放)       
           
                  3.控制事務的提交  最好手動提交事務,不但可以可以保證數據原子性,而且對新能提高留下余地.
                             try{
             connection.setAutoCommint(false);
                                  // 代碼 用PreparedStatement  性能比Statementh好.

                                  connection.commit();
                                  connection.setAutoCommit(true);
               }
                      catch(SQLException e){
                             }
                             finally{
             //代碼
             if(connection!=null){
                connection.close(); 
             }
                 }

           4.適當的選擇事務的隔離級別   TRANSACTION_READ_UNCOMMITED  性能最高
                                               TRANSACTION_READ_COMMITED    快
                                               TRANSACTION_REFEATABLE_READ  中等
                      RANSACTION_SERIALIZABLE      慢
           
             (3)Statement 優化
                jdbc3個接口用來處理sql的執行,是Statement PreparedStatement CallableStatement
                    提供適當的Statement接口
                    批量執行sql
                    從數據庫批量獲取數據
                PreparedStatement 比Statement性能要好 主要體現在一個sql語句多次重復執行的情況
                PreparedStatemnt只編譯解析一次而Statement每次編譯一次.
               
                批量修改數據庫  
           Statement 提供了方法addBatch(String)和executeBatch()
                  調用方法為stmt.addBatch("isnert....."); stmt.addBatch("update.....")
                            stmt.executeBatch();
                  也可以用PreparedStatement從而更好的提高性能.
                          pstmt=conn.preparedStatement("insert into test_table(......) values(....?)");
                          pstmt.setString(1,"aaa");
                          pstmt.addBatch();
                          pstmt.setString(1,"bbb");
                          pstmt.addBatch();
                          .....
                          pstmt.executeBatch();
           
                批量地從數據庫中取數據.
                    通過setFetchSize()和getFectchSize()方法來設定和查看這個參數.這個參數對體統的性能影響比較大.
                    這個參數太小會嚴重地降低程序地性能.
             Connection Statement ResultSet都有這個參數,他們對性能地影響順序是:
                       ResultSet---------Statement---------Connection
            (4)優化ResultSet.
               體現在以下幾個方面
                  批量讀取數據.合理設置ResultSet的getFetchSize()和setFetchSize()方法中的參數
                  使用正確的get和set方法
                       使用整數而不是字段名作為參數性能比較高,
                       例如 setInt(1,100);
                            setString(2,"aaaa");
                         比 setInt("id","100");
                            setString("name","aaaa");
                         性能好
                  設置適當的滾動方向.有3個方向FETCH_FORWORD,FETCH_REVERSE FETCH_UNKNOWN
                       單向滾動性能比較高.
            其他方面的性能優化
                及時顯示的關閉Connection Statement ResultSet
                    其中Connection可以用Connetion Pool處理.
                使用數據庫系統的強大查詢功能去組織數據.這樣程序運行是和數據庫服務的交互次數少,數據庫返回給
                程序的記錄條數少的多,所以性能有很大的提高.

          posted on 2006-03-03 00:05 kelven 閱讀(185) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 利津县| 金湖县| 绥芬河市| 天门市| 漯河市| 全州县| 鹤壁市| 阿鲁科尔沁旗| 施甸县| 抚远县| 离岛区| 平阳县| 封开县| 乐都县| 新余市| 会理县| 定日县| 梁河县| 赫章县| 临武县| 什邡市| 册亨县| 江口县| 浮梁县| 安图县| 阿巴嘎旗| 乌兰察布市| 西城区| 金山区| 无锡市| 沙雅县| 天峨县| 云林县| 聂拉木县| 普宁市| 麟游县| 左权县| 开化县| 水富县| 宁强县| 城固县|