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