JDBC學習筆記——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處理。
使用數據庫系統的強大查詢功能去組織數據。這樣程序運行是和數據庫服務的交互次數少,數據庫返回給程序的記錄條數少的多,所以性能有很大的提高。

 原文地址 http://hi.baidu.com/seekjob/blog/item/249db601b1a4a003738da531.html

發佈了36 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章