JDBC性能優化方案

jopen 10年前發布 | 14K 次閱讀 JDBC Java開發

  1.設置最優的預取值

        defaultRowPrefetch:預取條數默認值

         defaultBatchValue:觸發查詢操作的批量請求值

        這兩個參數的默認值都是10,我們可以通過增加這兩個參數值來減少數據庫請求以提高查詢效率,當然具體值大小要視具體情況而定。

  2.通過連接池獲取連接

     創建連接的代價很大,通過連接池獲取連接可省去創建連接時間。

  3.選擇合適的Statement接口(共有三種)

  • Statement:只支持靜態sql
  • PreparedStatement:支持動態輸入參數的sql, 因為其預編譯的sql具有可重用性,可極大地避免Oracle對sql的(應解析和軟解析)解析時間,提高查詢速度
  • CallableStatement:專門針對存儲過程,使用它能享受到所有存儲過程帶來的優勢,但也包括存儲過程帶來的劣勢如Java程序可移植性查,依賴數據庫等      
  • </ul> </div>

      4.設置檢索時的批量值

          Statement.getFetchSize();   獲取一次檢索的批量值

          Statement.setFetchSize(30); 設置批量值

          傳統情況下,設置FetchSize值對檢索大數據表時性能的提升是很明顯的,原因是jdbc驅動默認每次只檢索10條記錄(傳到客戶端的應該是一個游標),如果我們要檢索100條數據,那么就需要客戶端和服務器端進行10次網絡往返才能全部傳輸完畢,每次網絡間傳輸都會耗掉一些時間,比如采用 TCP/IP協議的話,要建立連接握手及額外的協議頭尾開銷等,這樣勢必會影響客戶端的響應。至于JDBC為何要設計這么小的數,有人說是為了避免jvm out of memory 問題。

    具體性能能提高多少,請參考:http://blog.lishman.com/2008/03/jdbc-fetch-size.html 

      5.設置ResultSet的批量值

          ResultSet.getFetchSize(); 獲取默認批量值

          ResultSet.setFetchSize(50); 設置批量值     

          處理大數據時可顯著提高處理速度

      6.設置ResultSet合適的處理方向

           ResultSet.getFetchDirection(); 獲取默認值

        ResultSet.setFetchDirection(FETCH_REVERSE);設置合適的值

      7.從ResultSet獲取數據時有兩種方式, rs.getObject(int column_index) 和 rs.getObject(String column_label)

    •  rs.getObject(int column_index):這種方式直接根據索引從rs對象中取出 ,最快 
    •  rs.getObject(String column_label) : 這種方式需要先通過label獲取到索引,然后再根據索引取數據,比直接利用索引多走了一步
    • </ul> </div>

       8.合理的使用ResultSet的getXXX()方法

          ResultSet提供了很多各式各樣的getxxx() 方法,比如你知道第一個值是String類型的話,那么就寫成getString(1),如果你不指示明確的話,它會則需要把這個值再轉換成合適的Java類型,轉換的代價是比較大的,如果檢索出來的數據有一百萬條的話,那么這個字段值就會被轉換一百萬次。

       9.優化查詢SQL

          比如避免使用select * from table where condition...,因為這么做會把所有的數據項目查詢出來,比如我們只需要Salary的話,我們就寫成select salary from employee where name=RR,避免不必要數據的檢索。

       10.Cache只讀(read-only)和主讀(read-mostly)表的數據

          只讀表的數據不會發生變化,主讀表發生變化較少,如果每次請求都讀一遍表的話顯然是沒有必要,因此可以把這些數據緩存起來。當然,對于主讀表要設定一定的更新時間。

       11.迭代分批次獲取數據替代一次大批量獲取數據

           某些情況下,應用程序可能會通過JDBC一次請求大量數據,而應用程序可能會一次把所有數據返回給客戶端,這樣會用掉很多時間,可以采取如下方式解決:

      • 在Server端緩存數據,分批次發給Client端,比如Server端查詢出1000條數據,可以分10批次每次傳送100條給Client端
      • 不在Server端緩存數據,而通過存儲過程迭代的返回小批量數據
      • </ul> </div> 來自:http://blog.csdn.net/suifeng3051/article/details/37900913

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!