Mybatis 流式读取大量MySQL数据

Java架构师社区

共 3164字,需浏览 7分钟

 · 2023-01-04

关注我们,设为星标,每天7:40不见不散,架构路上与您共享

回复架构师获取资源


大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。

'javajgs.com';

最近公司提了个需求 ,说公司的旧系统的报表导出的时候,数据量超过一万就导不出来了。经过分析,是旧系统做了限制。在更新的时候,查看了导出时虚拟机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,因为回调处理好了

示例代码

controller层:

@RequestMapping("/export")
  public void export(Vo vo, String props,
      HttpServletResponse response)
 
{

    //.......
      list = ossVipCustomService.selectForwardOnly(vo, Order.build());
    //......
  }

我推荐一套,架构师视频 155G 太全了
https://mp.weixin.qq.com/s/PoWsCNFAe_MlV_oANsfBT

service层:(重点)

public List<Bo> selectForwardOnly(Vo vo, Order order) {
     final List<Bo> list = new ArrayList<>();
    mapper.selectForwardOnly(vo, order, new ResultHandler<Bo>() {
      @Override
      public 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
    *
    FROM
    customer
  </select>

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

心路历程

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

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

来源:suveng.blog.csdn.net/article/details/85100239

到此文章就结束了。Java架构师必看一个集公众号、小程序、网站(3合1的文章平台,给您架构路上一臂之力,javajgs.com)。如果今天的文章对你在进阶架构师的路上有新的启发和进步,欢迎转发给更多人。欢迎加入架构师社区技术交流群,众多大咖带你进阶架构师,在后台回复“加群”即可入群。

第25期已结束!第26期已开始,1月1号截止





这些年小编给你分享过的干货


1.idea永久激活码(亲测可用)

2.优质ERP系统带进销存财务生产功能(附源码)

3.优质SpringBoot带工作流管理项目(附源码)

4.最好用的OA系统,拿来即用(附源码)

5.SBoot+Vue外卖系统前后端都有(附源码

6.SBoot+Vue可视化大屏拖拽项目(附源码)


转发在看就是最大的支持❤️

浏览 7
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报