讲师中心 微信公众号
AI工具推荐 视频效率加速

MyBatis中的流式查询怎么使用_ResultHandler处理百万级数据导出防OOM

小晨同学_3909

小晨同学_3909

发布时间:2026-03-19 09:38:49

|

1127人浏览过

|

来源于php中文网

原创

MyBatis流式查询需关闭自动提交并配置JDBC游标。必须使用ExecutorType.SIMPLE、禁用事务(@Transactional(propagation = Propagation.NOT_SUPPORTED))、设置useCursorFetch=true和defaultFetchSize=1000,禁用LIMIT与RowBounds,调整连接池超时参数。

mybatis中的流式查询怎么使用_resulthandler处理百万级数据导出防oom

MyBatis流式查询必须关掉自动提交

MyBatis默认用ExecutorType.SIMPLE,查完就缓存整个结果集到内存,哪怕你写了ResultHandler也没用——流式根本没生效。关键动作是显式指定ExecutorType.SIMPLE并关闭事务自动提交。

  • 在SqlSessionTemplate或SqlSessionFactoryBean配置里加executorType="SIMPLE"(Spring Boot 2.3+ 可用mybatis.configuration.default-executor-type=simple)
  • 手动获取SqlSession时,必须用sqlSessionFactory.openSession(ExecutorType.SIMPLE, false),第二个参数false才是重点:不自动commit,才能保持游标打开
  • 如果用了@Transactional,它会强制开启事务并自动commit,直接废掉流式——导出接口务必加@Transactional(propagation = Propagation.NOT_SUPPORTED)

ResultHandler里别存数据,直接写文件或响应流

常见错误是把每条记录add进ArrayList,等处理完再统一写,这等于又回到内存全量加载。流式的意义就是“来一条、写一条、丢一条”。

  • 导出Excel用Apache POI SXSSFWorkbook,每100行row.flush(),避免Sheet缓存撑爆堆
  • 写CSV直接用OutputStreamWriter + BufferedWriter,字符编码设为UTF-8,别用String.concat拼接大字段
  • Spring MVC中返回ResponseEntity<streamingresponsebody></streamingresponsebody>,在lambda里写outputStream,记得flush()但别close()(由框架关)

MySQL驱动要配streaming参数,否则还是全量拉

MyBatis只是调度层,底层JDBC驱动不配合,照样OOM。MySQL Connector/J 默认把结果集全读进内存,必须显式启用流式游标。

  • 连接URL加参数:?useCursorFetch=true&defaultFetchSize=1000(注意&要转义)
  • useCursorFetch=true让驱动用服务器端游标,defaultFetchSize=1000控制每次从服务端取多少行,值太小IO多,太大内存压力大,1000是较稳的起点
  • 确认驱动版本≥5.1.38 或 ≥8.0.16,老版本useCursorFetch无效,会静默降级成普通查询
  • 执行前检查ResultSet.getFetchSize()是否返回1000,不是说明配置没生效

分页查询和流式查询不能共存

有人想“先count再limit流式”,这是典型误区。LIMIT会让MySQL无法使用游标,ORDER BY + LIMIT也会触发临时表,彻底破坏流式能力。

  • 流式只适用于无offset的全量扫描,比如按主键WHERE id > ? ORDER BY id做游标分段
  • 真要支持“跳过前10万行再导出”,得用id > last_id方式分批查,每次查1万行,用上一批最后id当起点
  • 别在SQL里写LIMIT #{offset}, #{size},MyBatis的RowBounds也一样,它们和流式互斥

最易被忽略的是连接池配置:HikariCP默认connection-timeout=30000,而百万行导出可能耗时几分钟,必须调大connection-timeout和idle-timeout,不然中途连接被池回收,ResultSet is closed就来了。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

583

2023.08.21

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2942

2024.02.23

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

446

2024.02.23

mybatis工作原理及流程是什么
mybatis工作原理及流程是什么

mybatis工作原理及流程:1、配置文件;2、接口与映射;3、sql解析与生成;4、执行计划;5、结果处理;6、动态sql;7、缓存机制;8、插件;9、事务管理;10、日志与监控;11、扩展性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

292

2024.02.23

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

302

2024.02.23

Java MyBatis框架
Java MyBatis框架

本专题专注于Java主流ORM框架MyBatis的应用,系统讲解SQL映射、动态SQL、结果映射、分页查询、缓存机制与多表关联等核心内容,并结合企业管理系统、电商平台和后台管理项目实战,帮助学员全面掌握高效的数据库持久层开发技能。

6329

2025.08.26

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

0

2026.11.05

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

0

2026.11.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn