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

原文地址:https://www.cnblogs.com/muzhongjiang/p/15060341.html