摘要: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秒。算變快很多。(在多控制一下記憶體,應該會加快速度。