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