JDBC學習筆記-----jdbc效能最佳化 (轉)

amyz發表於2007-11-13
JDBC學習筆記-----jdbc效能最佳化 (轉)[@more@]

  JC學習筆記-----
jdbc的效能主要由兩個因素決定,一是本身的性質,另一個是與資料庫相對獨立的jdbc應用程式介面()的使用.這裡說的是如何正確使用jdbc介面,以獲得更好的效能.
  jdbc主要最佳化有:
  1.選擇正確的jdbc程式
  2.Connention的最佳化  使用連線池來管理Connection
  3.Statement的最佳化  使用批次等
  4.Result的最佳化  正確的從資料庫中get資料等
 
  (1)選擇正確的jdbc驅動程式:
 1 jdbc-odbc 橋
   2 本地api-部分 驅動
  3 jdbc網路-純java驅動
  4 jdbc本地協議
  最好選擇 jdbc網路協議-純java驅動  比較高  但需要第三方的支援 比如  LOGIC屬於這種型別
 
  (2)最佳化Connection物件:
  1.設定適當的引數  Manager.getConnection(String url,Properties props);
  例如:  Properties props=new Properties();
  props.put("user","wuwei");
  props.put("pass","wuwei");
    props.put("defaultRowPrefectch","30");
  props.put("dufaultBatchValue","5");
  Connection con=DriverManager.getConnection("jdbc::thin:@hostsString",props);
    物件可以透過設定setDefaultRowPrefetch(int) 和 setDefaultBatchValue(int) 兩個引數類最佳化連線

 2.使用連線池  可以自己寫一個連線池 這樣程式的靈活性強,便於移植.
  專案開發了一套非常通用而表現非常穩定的物件池
  設計了自己的連線池後 在客戶端建立物件
  public 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(Exception 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 提供了方法adtch(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可以用Coion Pool處理.
  使用資料庫的強大查詢功能去組織資料.這樣程式執行是和資料庫服務的互動次數少,資料庫返回給
  程式的記錄條數少的多,所以效能有很大的提高.
 
 

 

 

 

 

 

 

 

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982095/,如需轉載,請註明出處,否則將追究法律責任。

相關文章