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效率最高;