1. 程式人生 > >Mysql遍歷大表(Mysql大量資料讀取記憶體溢位的解決方法)

Mysql遍歷大表(Mysql大量資料讀取記憶體溢位的解決方法)

mysql jdbc預設把select的所有結果全部取回,放到記憶體中,如果是要遍歷很大的表,則可能把記憶體撐爆。

  • 一種辦法是:用limit,offset,但這樣你會發現取資料的越來越慢,原因是設定了offset,mysql需要將讀取位置移動到offset的位置,隨著offset增大,取資料也越來越慢;
  • 另外一種辦法是:用資料流的方式取資料,這時需要設定:
Java程式碼   收藏程式碼
  1. stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,  
  2.               java.sql.ResultSet.CONCUR_READ_ONLY);  
  3. stmt.setFetchSize(Integer.MIN_VALUE);  

這時候,mysql jdbc driver,一行行的取結果集。

但這種方式有幾個限制:

  1. 只能從該連線只能取完所有結果集後才能執行其他SQL;
  2. resultset.getRow(),是不支援的,呼叫會拋unsupportedException;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------   我在使用該方法的時候出現過類似以下錯誤: Caused by:  java.sql.SQLException: Streaming result set com. mysql[email protected]
is still active.No statements may be issued when any streaming result sets are open and in use on a given connection.Ensure that you have called .close() on any active streaming result sets before attempting more queries. 原因就是違反了第一個限制,所以如果查詢的資料集沒有讀取完,其他的sql操作都要另起一個connection。