Mybatis/MySQL的大數據量查詢佔用內存的問題

在這裏先簡單的記錄一下,詳細信息後續再不上;

 

現在都流行Oracle切換成mysql,公司也在這麼做,系統改好進行壓測時,發現使用的內存比使用Oracle的程序要大很多;

原來使用Oracle的時候,最初版本是一次性將查詢結果,轉換成List,然後一條條處理;隨着數據量大,偶爾系統會爆出OOM,改變了使用方式,從一次性將查詢結果轉換成List,改成使用 ResultHandler的方式,同時優化了性能,增加了fetchSize參數,這樣一下子節省了大量的內存使用,但切換成MySqL,發現狀況又向最初Oracle使用,把查詢結果一次性轉成List的情況;

最明顯的,是使用jvisualvm進行監控時,發現系統的內存一直在漲,只有當系統內存打到最高點的時候,纔看到處理的log;這樣明顯的是 系統將查詢結果都裝載進客戶端後,再調用ResultHandler進行處理;

網上找了一點資料,看MySqL確實是有這個問題,mysql有兩種方式:stream方式,以及fetchAll方式;我們現在使用的就是fetchAll方式,一次性將數據加載到內存中;

使用stream方式,看了一下要滿足以下幾個條件:

  • 是否支持cursor read:主要一點滿足MySqL的版本:最小5.0.2
  • resultSetType=TYPE_FORWARD_ONLY
  • resultConcurrency=CONCUR_READ_ONLY
  • fetchSize=Integer.MIN_VALUE

只有這樣纔會進行stream方式,最上面3點是系統缺省的,就是最後一點要在代碼裏修改的,在查詢的xml文件中,增加/修改了一個參數:

fetchSize="-2147483648"

還有文章寫到,mysql的鏈接串,需要設置參數 useCursorFetch=true,否則無效; 暫時沒有時間嘗試加這個參數和不加這個參數的差別,在做測試的時候,加了這個參數的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章