mysql游標處理大批量數據問題


  今天在類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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM