keep moving!

          We must not cease from exploration. And the end of all our exploring will be to arrive where we began and to know the place for the first time.
          隨筆 - 37, 文章 - 2, 評論 - 3, 引用 - 0

          導航

          <2008年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          blog收藏

          文件共享

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          JDBC性能優化

          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 2008-09-07 02:22 大石頭 閱讀(253) 評論(0)  編輯  收藏 所屬分類: 基礎

          主站蜘蛛池模板: 尉氏县| 富蕴县| 丰城市| 蓬安县| 信丰县| 晋宁县| 德保县| 海原县| 怀宁县| 绍兴市| 江门市| 沐川县| 桑植县| 遂平县| 阜宁县| 徐汇区| 辽阳县| 阜康市| 石渠县| 仁化县| 江陵县| 平遥县| 会东县| 远安县| 武邑县| 清新县| 尚志市| 华阴市| 宿松县| 武功县| 南阳市| 芦山县| 翁牛特旗| 株洲县| 博乐市| 邯郸县| 鄂托克旗| 息烽县| 皋兰县| 两当县| 喀喇沁旗|