寶貝小豬嘜

          常用鏈接

          統計

          最新評論

          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");
          ???????????????????????????????????? }
          ???????????? 銷毀對象時用
          ?????????????????????????? publicvoid 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-12-01 14:56 寶貝小豬嘜 閱讀(150) 評論(0)  編輯  收藏 所屬分類: 數據庫相關

          主站蜘蛛池模板: 合水县| 上思县| 繁昌县| 阿荣旗| 泽普县| 含山县| 保德县| 胶州市| 岳池县| 临泉县| 房产| 杭州市| 郑州市| 宣威市| 平乡县| 土默特右旗| 剑阁县| 黑山县| 朔州市| 天镇县| 海兴县| 甘德县| 资阳市| 汶上县| 隆昌县| 武义县| 繁昌县| 二连浩特市| 常山县| 怀仁县| 丰都县| 松阳县| 蓬溪县| 平陆县| 卢氏县| 夹江县| 彝良县| 合作市| 吐鲁番市| 西藏| 湘阴县|