美文网首页数据库及存储
MyBatis读取大量数据(流式读取)

MyBatis读取大量数据(流式读取)

作者: miaoyj | 来源:发表于2022-01-16 10:03 被阅读0次

说明

导出大量数据时,虚拟机频繁GC,内存耗尽,CPU爆满

场景:java端从数据库读取100W数据进行后台业务处理

方案

可采用Mybatis数据流式读取进行优化

  1. 分页读取出来。缺点:需要排序后分页读取,性能低下。
  2. 一次性读取出来。缺点:需要很大内存,一般计算机不行。
  3. 建立长连接,利用服务端游标,一条一条流式返回给java端。
  4. jdbc中有个重要的参数fetchSize(它对业务实现无影响,即不会限制读取条数等),优化后可显著提升性能。

内容

JDBC三种读取方式:

  1. 一次全部(默认):一次获取全部。

  2. 流式:多次获取,一次一行。

  3. 游标:多次获取,一次多行。

  4. Mapper层

    <select id="exportAll" resultType="jjche.demo.modules.student.vo.StudentVO" resultSetType="FORWARD_ONLY"
            fetchSize="-2147483648">
        SELECT * FROM students
    </select>
  1. Dao层
void exportAll(ResultHandler<StudentVO> handler);
  1. Service层
this.baseMapper.exportAll(resultContext -> {
            StudentVO studentVO = resultContext.getResultObject();
            list.add(studentVO);
        });

原理分析

  1. 先在服务端执行查询后将数据缓存在服务端。(耗时相对较长)
  2. java端获取数据时,利用服务端游标进行指针跳动,如果fetchSize为1000,则一次性跳动1000条,返回给java端缓存起来。(耗时较短,跳动次数为N/1000)
  3. 在调用next函数时,优先从缓存中取数,其次执行2过程。(内存读取,耗时可忽略)

相关文章

  • fs文件系统操作

    基础写入文件 简单写入文件 流式文件写入 简单文件读取 流式文件读取 流式文件拷贝(读取 + 写入) 复制文件 f...

  • Mybatis简单操作学习

    Mybatis 一、搭建demo 在使用Mybatis读取数据库时,需要构建SqlSessionFactory对象...

  • [Mybatis] 读取数据库时间出现时间差

    问题 使用mybatis读取mysql数据库里的timestamp字段时,发现读取所得时间比数据库原始数据多了几小...

  • 【Spark】Spark 存储原理--读数据过程

    本篇结构: 读取数据块过程 内存读取 磁盘读取 远程读取 一、读取数据块过程 BlockManager 的 get...

  • 读取大量数据批量更新

    1. 先看结果对比 1.1 测试数据 测试租户:znfangcadmin 经纪人数据量:199003 做的事情:將...

  • iOS大量数据读取操作

    大量数据读写操作 总结 减少中间的冗余copy操作,节省CPU占用率 异步线程处理、否则卡主线程

  • 利用Python处理Excel数据

    读取数据 读取x.xlsx文件 读取文件夹 读取txt文件 读取csv格式Excel表 写入excel 显示数据 ...

  • J2SE 流

    Java流式输入输出原理 输入流(InputStream):程序从输入流读取数据源。数据源包括外界(键盘、文件、网...

  • Hadoop小解疑

    1. Hadoop中的流数据访问 Hadoop采用“一次写入、多次读取(流式数据访问)”的访问模式。对于大规模数据...

  • Python数据获取-文件、word、Excel、数据库

    从文本文件读取数据 从word读取数据 通过Excel读取数据 从MYSQL获取数据

网友评论

    本文标题:MyBatis读取大量数据(流式读取)

    本文链接:https://www.haomeiwen.com/subject/fscchrtx.html