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