1. 程式人生 > >正確使用MySQL JDBC setFetchSize()方法解決JDBC處理大結果集 java.lang.OutOfMemoryError: Java heap space

正確使用MySQL JDBC setFetchSize()方法解決JDBC處理大結果集 java.lang.OutOfMemoryError: Java heap space

() lai 設置 從服務器 rest direction tools start 記錄

昨天在項目中需要對日誌的查詢結果進行導出功能。

日誌導出功能的實現是這樣的,輸入查詢條件,然後對查詢結果進行導出。由於日誌數據量比較大。多的時候,有上億條記錄。

之前的解決方案都是多次查詢,然後使用limit 限制每次查詢的條數。然後導出。這樣的結果是效率比較低效。

那麽能不能一次查詢就把所有結果倒出來了?於是我就使用一次查詢,不使用limit分頁。結果出現 java.lang.OutOfMemoryError: Java heap space問題。

看來是DB服務器端將一次將查詢到的結果集全部發送到Java端保存在內存中。由於結果集比較大,所以出現OOM問題。

首先我想到的是遊標功能。那麽是不是可以使用遊標,一次從服務器端慢慢的取呢?上網查詢了一下,大家都說MySQL不支持遊標功能等等。

後來就去看JDBC代碼。找到了setFetchSize()方法,結果設置以後,卻不能生效,還是出現OOM問題。

我的設置如下

[java] view plain copy
  1. ps=conn.con.prepareStatement("select * from bigTable");
  2. ps.setFetchSize(1000);



後來在MySQL看到了這樣的方法:

[java]
view plain copy
    1. ps = (PreparedStatement) con.prepareStatement("select * from bigTable",
    2. ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    3. ps.setFetchSize(Integer.MIN_VALUE);
    4. ps.setFetchDirection(ResultSet.FETCH_REVERSE);

正確使用MySQL JDBC setFetchSize()方法解決JDBC處理大結果集 java.lang.OutOfMemoryError: Java heap space