Java - PreparedStatement 設定TYPE_FORWARD_ONLY

摘要:Java - PreparedStatement 設定TYPE_FORWARD_ONLY

這次如果我要撈的資料量約莫大概是60萬筆的資料,

而資料量一定會大到沒有記憶體可以分配,

這會導致OutOfMemoryError: Java heap space

在存取資料資料時,未必要一次全撈再進行rs.next()

有方法可以設定,需要時,撈一部分的資料下來,等next剛好的位置時,再next下一批資料。

避免沒有足夠的記憶體空間可以存放,

 

處理完一批,就換下一批。

 

Java 存取 MySQL改寫如下

原本如下:

pstmt = conn.prepareStatement(sql);

改寫如下
pstmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
pstmt.setFetchSize(Integer.MIN_VALUE);
rs =pstmt.executeQuery();
 
while(rs.next())
{
       //todo
}

用這樣的方式,60萬筆資料,還不會出錯~~

(不過還是要注意量的問題)

 

雖然這樣60萬筆,還是需要花2分7秒才完成,

查詢時間大約花49秒

 

然我將setFetchSize(Integer.MIN_VALUE) 設為 setFetchSize(10000)

結果還是outofmemory

我想是最後的剩餘空間,已無法多加10000筆的記憶體資料。(跟Server的記憶體規格有關,本人也只有2G的Memory,跑這樣的程式~~……一開機就佔了75%了)

 

最後撈60萬筆,只有一分鐘。,全部花1分18秒。算變快很多。(在多控制一下記憶體,應該會加快速度。