天天看點

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分鐘。