MySQL以cursor方式讀取(useCursorFetch,FetchSize參數)


MySQL設置了useCursorFetch,FetchSize參數的影響

 

從MySQL中獲取大量的數據出來,如果不設置 useCursorFetch,mysql會把所有的數據從數據庫server端搬到client端后再做處理,這樣我們原先使用ResultHandler的方式節省內存的打算就落空了。

還好MySQL在連接串上,使用了useCursorFetch=true,就可以達到將部分數據搬到客戶端就進行處理,那么這時 FetchSize 對系統會產生什么影響;

以下FetchSize設置成 Integer.MIN_VALUE 和 一個常量,來進行比較 (如果不設置FetchSize,和不使用useCursorFetch參數效果一樣):

  • 獲取總數據量: 55.6w條
  • ResultHandler中,使用空方法;
FetchSize值 內存消耗-通過JVisualVM觀測 第一次獲取全部數據用時 第二次獲取全部數據用時
Integer.MIN_VALUE 幾乎看不到byte[]消耗的內存 10.093s 10.12s
10000

byte[]占用內存,僅次於char[]

每次變化,差不多在10M上下(這個和每條記錄的大小有關)

21.892s 22.376s
500   28.81s 28.188s
1  

時間太長了,還以為死了,加了一個斷點看還活着

吃好飯回來看,竟然用了2438.094s,

 

用FetchSize=500又試了一次,全部獲取到時間,比10000條的設置時間要長,那看來FetchSize=Integer.MIN_VALUE不能認為是FetchSize=1,確實只能認為是文檔上的 stream 方式;

后來確確實實用FetchSize=1做了一次,竟然用了40分鍾。

如果把FetchSize=Integer.MIN_VALUE,當成每次取一條,耗時比 FetchSize=10000 少一半時間;看來還是用 FetchSize=Integer.MIN_VALUE效率最高;

 

 


免責聲明!

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



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