1. 程式人生 > >JDBC性能優化方案

JDBC性能優化方案

hsi bject article margin all 取數 叠代 都是 接口

最近用到了利用JDBC查詢Oracle數據庫。可是查詢效率不盡人意。研究了一下JDBC方面能夠優化的地方,在這裏跟大家分享一下。

1.設置最優的預取值 defaultRowPrefetch:預取條數默認值 defaultBatchValue:觸發查詢操作的批量請求值 這兩個參數的默認值都是10。我們能夠通過添加這兩個參數值來降低數據庫請求以提高查詢效率,當然詳細值大小要視詳細情況而定。 2.通過連接池獲取連接 創建連接的代價非常大,通過連接池獲取連接可省去創建連接時間。

3.選擇合適的Statement接口(共同擁有三種)
  • Statement:僅僅支持靜態sql
  • PreparedStatement:支持動態輸入參數的sql, 由於其預編譯的sql具有可重用性,可極大地避免Oracle對sql的(應解析和軟解析)解析時間,提高查詢速度
  • CallableStatement:專門針對存儲過程,使用它能享受到全部存儲過程帶來的優勢,但也包含存儲過程帶來的劣勢如Java程序可移植性查,依賴數據庫等
4.設置檢索時的批量值 Statement.getFetchSize(); 獲取一次檢索的批量值
Statement.setFetchSize(30); 設置批量值 傳統情況下,設置FetchSize值對檢索大數據表時性能的提升是非常明顯的。原因是jdbc驅動默認每次僅僅檢索10條記錄(傳到client的應該是一個遊標),假設我們要檢索100條數據,那麽就須要client和server端進行10次網絡往返才幹所有傳輸完成。每次網絡間傳輸都會耗掉一些時間,比方採用TCP/IP協議的話。要建立連接握手及額外的協議頭尾開銷等,這樣勢必會影響client的響應。

至於JDBC為何要設計這麽小的數。有人說是為了避免jvm out of memory 問題。

詳細性能能提高多少,請參考:http://blog.lishman.com/2008/03/jdbc-fetch-size.html 當然,FetchSize並非越大越好。至於原因請參考:http://stackoverflow.com/questions/9220171/setting-oracle-size-of-row-fetches-higher-makes-my-app-slower 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獲取到索引。然後再依據索引取數據,比直接利用索引多走了一步

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一次請求大量數據,而應用程序可能會一次把全部數據返回給client,這樣會用掉非常多時間,能夠採取例如以下方式解決:

  • 在Server端緩存數據,分批次發給Client端。比方Server端查詢出1000條數據,能夠分10批次每次傳送100條給Client端
  • 不在Server端緩存數據。而通過存儲過程叠代的返回小批量數據

JDBC性能優化方案