Mybatis 流式读取大量MySQL数据
2023-06-13 09:17:27 时间
最近公司提了个需求 ,说公司的旧系统的报表导出的时候,数据量超过一万就导不出来了。经过分析,是旧系统做了限制。在更新的时候,查看了导出时虚拟机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的配置。嗯,没用
相关文章
- MySQL中快速新增数据的命令技巧(mysql新增数据命令)
- MySQL注入攻击防范之道(过滤mysql注入)
- MySQL插入数据的速度提升(mysql插入效率)
- 解决MySQL数据乱码解决方案(mysql数据乱码)
- MySQL数据库模拟表锁定技术(mysql模拟锁表)
- MySQL中利用正则表达式实现数据替换(mysql正则替换)
- MySQL中存储生日类型的最佳实践(mysql生日类型)
- MySQL条件累加:实现复杂数据查询的便捷方式(mysql条件累加)
- MySQL实时日统计:查看每天的数据洞察(mysql查询每天数据)
- MySQL 数据库表信息查询(mysql表信息)
- MySQL数据去重技巧,有效防止重复写入数据,提高数据处理效率。(mysql防止重复数据)
- MySQL索引失效:分析与常见场景(mysql索引失效的场景)
- MySQL 维护之路:使用维护工具优化性能(mysql维护工具)
- 的迁移MySQL优化实践:大量数据的迁移(mysql大量数据)
- MySQL数据库备份策略实施方案(mysql备份策略)
- MySQL中创建数据库的简易步骤(在mysql下创建数据库)
- MYSQL原子性保障方法详解(mysql中保证原子性)
- MySQL中IN操作存在漏洞(mysql中in有漏)
- MySQL中使用ANY函数取字段最大值(mysql中any取最值)
- 库轻松实现使用bat批处理快速导入MySQL数据库(bat导入mysql数据)
- 宇宙中的开放数据基于Apollo和MySQL的实现(apollo mysql)
- 从mdb导入MySQL的技术实现(.mdb 存到mysql)
- 深入探索MySQL技术丁奇45的使用指南(mysql丁奇45)