⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 suveng.blog.csdn.net/article/details/85100239 「suveng」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

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

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的配置。嗯,没用。

文章目录
  1. 1. JDBC三种读取方式:
  2. 2. 开发环境:
  3. 3. 实现步骤:
  4. 4. 示例代码
  5. 5. 心路历程