今天在類MYSQL數據庫使用游標(spring的jdbcTemplate)讀取大批量數據(幾百萬)的時候,發現系統的內存飆升,一直到內存溢出,而程序並沒有執行到具體的處理邏輯上。
同樣的程序,在ORACLE是可以正常執行的,所以可以確定程序本身是沒問題的,但MYSQL的處理是將數據全部讀取出來后才做處理。
源程序如下,test表500w,類MYSQL數據庫直接執行,直到內存溢出都不會打印出東西:
jdbcTemplate.query("select * from test", rs->{
System.out.println(rs);
});
解決辦法:
jdbcTemplate.setFetchSize(Integer.MIN_VALUE);
在查詢前,設置上fetchSize,就可以游標正常處理數據了。
注:
后面網上找了下,一共有3種方法可以使用:
1、當statement設置以下屬性時,采用的是流數據接收方式,每次只從服務器接收部份數據,直到所有數據處理完畢,不會發生JVM OOM
setResultSetType(ResultSet.TYPE_FORWARD_ONLY); setFetchSize(Integer.MIN_VALUE);
2、調用statement的enableStreamingResults方法。封裝了第一種方法的實現
3、設置連接屬性useCursorFetch=true
