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

  • 相关阅读:
    数据库是什么以及用来干嘛
    10.3
    10.2
    12.7
    12.5
    12.4
    12.3
    12.2
    12.1JOptionPane
    11.30eclipse常用快捷键
  • 原文地址:https://www.cnblogs.com/muzhongjiang/p/15060341.html
Copyright © 2020-2023  润新知