点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方有惊喜,留言必回,有问必答!

每一天进步一点点,是成功的开始...

背景

最近公司提了个需求,说公司的旧系统的报表导出的时候,数据量超过一万就导不出来了。经过分析,是旧系统做了限制。在更新的时候,查看了导出时虚拟机GC情况,发现原先程序执行时,内存激增,经过Google决定采用流式读取对sql进行优化。

JDBC三种读取方式

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

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

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

mybatis默认采取第一种。

开发环境

jdk1.8 、intellij IDEA 2018

mybatis 3 、 springMVC 、Spring 4

实现步骤

实现流式读取的方式不止一种,但是我只能说我解决的这种,对不起,我不是大神级的。

这里采用的 controller、service、dao分层开发

  • 在service层调用dao接口是,增加一个回调参数ResultHandler<>

  • 对应的dao接口返回值为void

  • mapper 填写 parameterType、resultMap、resultSetType=“FORWARD_ONLY”fetchSize="-2147483648"

为什么dao返回值为void还要在mapper写resultMap?因为回调要用你的resultMap处理,但是不应该返回给service,因为回调处理好了。

推荐下几个月熬夜整理的近 10000+ 面试资料大全:https://gitee.com/yoodb/eboo‍ks

示例代码

controller层:

@RequestMapping("/export")public void export(Vo vo, String props,HttpServletResponse response) {//.......list = ossVipCustomService.selectForwardOnly(vo, Order.build());//......}

service层:(重点)

public List<Bo> selectForwardOnly(Vo vo, Order order) {final List<Bo> list = new ArrayList<>();mapper.selectForwardOnly(vo, order, new ResultHandler<Bo>() {@Overridepublic void handleResult(ResultContext<? extends Bo> resultContext) {/**回调处理逻辑 */list.add(resultContext.getResultObject());}});return list;}

dao层:(重点)

/*** 流式读取数据* @param vo 查询对象* @param order 排序* @param ossVipCustomerBoResultHandler 回调处理*/void selectForwardOnly(@Param("record") Vo vo, @Param("order") Order order,ResultHandler<Bo> handler);

mapper:(重点)

<select id="selectForwardOnly"parameterType="com.*.Vo" resultMap="GetListBo"resultSetType="FORWARD_ONLY" fetchSize="-2147483648">SELECT*FROMcustomer</select>

个人原因:删除非关键部分代码。你肯定看的懂得。

心路历程

Google了好久的一个原因,就是因为dao接口不应该返回值的。还麻烦了老大过来看了一眼。

还有就是google出来的那些,要改框架配置的,我的确跟着改了,改了mysql连接参数,还有mybatis setting的配置。嗯,没用。

版权声明:本文为CSDN博主「suveng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

https://suveng.blog.csdn.net/article/details/85100239

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

------ THE END ------

精品资料,超赞福利!

>Java精选面试题<
3000+ 道面试题在线刷,最新、最全 Java 面试题!

期往精选  点击标题可跳转

【260期】PageHelper 使用 ThreadLocal 的线程复用问题,你用对了吗?

【261期】为什么 BigDecimal 类不能使用 equals() 方法做等值比较?

【262期】面试官:jwt 是什么?java-jwt 呢?懵逼了。。。

【263期】面试官问:假设有一千万数据,怎么快速查询?

【264期】面试官问:Spring Boot 启动时自动执行代码方式有哪几种?解释一二!

【265期】面试官:列举 8 种 Docker 应用场景,你对哪些有了解?

【266期】面试官问:为什么 SQL 要尽量避免使用 IN 和 NOT IN?

【267期】Spring Boot 如何整合 WebSocket 实现群聊,一对一聊天?

 技术交流群!

最近有很多人问,有没有读者交流群!想知道如何加入?方式很简单,兴趣相投的朋友,只需要点击下方卡片,回复“加群”,即可无套路入交流群!

文章有帮助的话,在看,转发吧!

【267期】面试官:Mybatis 如何实现流式读取 MySQL 大数据量记录?相关推荐

  1. MyBatis中使用流式查询避免数据量过大导致OOM

    欢迎关注方志朋的博客,回复"666"获面试宝典 今天mybatis查询数据库中大量的数据,程序抛出: java.lang.OutOfMemoryError: Java heap s ...

  2. mybatis中mysql流式读取_MyBatis读取大量数据(流式读取)

    ## 一.背景 导出大量数据时,虚拟机频繁GC,内存耗尽,CPU爆满,可采用Mybatis数据流式读取进行优化. ## 二.JDBC三种读取方式: 1. 一次全部(默认):一次获取全部. 2. 流式: ...

  3. 【送书福利-第四期】从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战书籍

    大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员.关注公众号[程序员洲洲]即可获得10G学习资料.面试笔记.大厂独家学习体系路线等-还可以加入技术交流群欢迎大家在CSDN后台私信我! 送书福利-第四 ...

  4. 面试精讲之面试考点及大厂真题 - 分布式专栏 17 ElasticSearch解决大数据量检索难题

    17 ElasticSearch解决大数据量检索难题 理想的书籍是智慧的钥匙. --列夫·托尔斯泰 引言 如果你的项目里有超过千万上亿级别的数据,且数据日增量较大需要高性能检索时,如订单数据,你该怎么 ...

  5. MyBatis Plus 解决大数据量查询慢问题

    分享知识 传递快乐 大数据量操作的场景大致如下: 数据迁移 数据导出 批量处理数据 在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理.但有些情况不需要分页的方式 ...

  6. Mybatis 大数据量的批量insert解决方案

    前言 通过Mybatis做7000+数据量的批量插入的时候报错了,error log如下: , ('G61010352', '610103199208291214', '学生52', 'G610103 ...

  7. 干货|50个大数据面试问题及答案第二篇:10个大数据面试中级问题

    上一篇文章我们总结了10个大数据面试入门级问题,大家是否有收获,如果还没有看的小伙伴,可以直接跳转<干货|50个大数据面试问题及答案第一篇:10个大数据面试入门级问题>开始学习吧! 本次我 ...

  8. 大数据量查询:流式查询与游标查询

    最近在做一个计算相关的功能,大体就是有很多条SQL,每条SQL都涉及复杂地运算,最后要将所有计算结果进行合并分析.经初步测试,每个SQL起码会查出几十万条记录,我们现在有毛毛多的这种SQL. 最大的问 ...

  9. 多进程IterableDataset流式读取数据的坑:每个进程会读取一遍完整数据

    构建流式读取DataLoader的方法可以参考:pytorch构造可迭代的DataLoader,动态流式读取数据源,不担心内存炸裂(pytorch Data学习三) 使用如下方法构造DataLoade ...

最新文章

  1. surface pro 3 linux,新闻|在Surface Pro 3上运行Ubuntu – 虽不完美但很有戏
  2. 第一:做学位论文期间,不要有任何度假休息的打算;第二,导师错的时候不多;第三……...
  3. js关闭手机浏览器_Unity 之 WebGL打开手机摄像头
  4. linux go redis,使用go来操作redis的方法示例
  5. 通过javascript实现的轻量级模态框解决方案(支持Ajax)
  6. 旧计算机 云桌面,该不该利用旧PC机改造成云桌面虚拟化模式呢?
  7. LeetCode 559. N叉树的最大深度
  8. 漫画:什么是囚徒困境?
  9. 从Android上的相机裁剪图像
  10. Flink CDC + Hudi + Hive + Presto 构建实时数据湖最佳实践
  11. studio one 3 机架声道设置_「声卡跳线」IXI Mega M8 声卡电脑/手机直播机架跳线(图文教程)...
  12. Mac下安装激活matlab2017b教程方法
  13. 小学计算机房荷载,资深暖通设计师总结的常用参数参考值,新手们都说感谢大神支招...
  14. wg运行内存装MySQL8_搭建Mysql-proxy实现主从同步读写分离
  15. k8s生命周期---容器探测
  16. Padavan固件免流,能连接成功暂时没测成功免流没有
  17. tomcat无法响应请求,假死
  18. win10环境下Android SDK下载安装及配置教程
  19. GraalVM Enterprise Edition 22.3.0 企业版安装
  20. 不要做一个只会抱怨的人

热门文章

  1. MySQL: Invalid GIS data provided to function st_geometryfromtext
  2. 《Activiti 深入BPM工作流》---如何创建默认的activiti的25张表?
  3. 控制工程基础 董景新_全市第一!镇江新区新建成6家省级研发机构
  4. 万向副董肖风:区块链的六大治理机制
  5. WebSocket使用@OnMessage注解无法收到消息的坑与解决方法
  6. 唯快不破,2019最快的固态硬盘(SSD)大盘点,绝对值得收藏
  7. c语言中英文翻译 毕业设计,c语言中英文翻译资料 毕业(设计)论文.doc
  8. ElasticSearch前世今生lucene
  9. pip切源,Python安装selenium和chromedriver
  10. 2021年危险化学品生产单位安全生产管理人员新版试题及危险化学品生产单位安全生产管理人员免费试题