zoukankan      html  css  js  c++  java
  • 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效率最高;

  • 相关阅读:
    迭代器、可迭代对象、生成器
    提问的智慧
    爬虫【自动登陆github和抽屉】
    爬虫【爬取汽车之家新闻】
    Python多线程-守护线程
    Python的多线程
    一个简单的Python多线程
    Python实现SSH传输文件(sftp)
    Python实现SSH连接远程服务器
    实验吧CTF题库-WEB题(部分)
  • 原文地址:https://www.cnblogs.com/muzhongjiang/p/15060341.html
Copyright © 2011-2022 走看看