MyBatis 千万级数据导出 OOM 了?流式查询+游标分批,内存从 4G 降到 200M
引言 运营小妹发来消息:"帮我导出最近半年的订单数据,要 Excel 格式,有 1000 多万条。" 你自信满满:"小意思,十分钟搞定。" 启动导出任务,看了一眼进度条,2 分钟后接口直接挂了。 查看日志: java.lang.OutOfMemoryError: Java heap space 堆内存飙到了 4G,GC 把 CPU 跑满,服务假死。 你又试了试加 -Xmx8g——这次撑了 5 分钟,还是挂了。 这就是大数据导出的典型坑:MyBatis 默认一次性把结果加载到内存,1000 万条订单 × 每条 50 个字段 ≈ 5-8 个 G,直接爆。 本文从踩坑的代码出发,一步步演进到最终方案: MyBatis 流式查询 → ResultHandler 逐条处理 → CSV 分片 → SXSSF 流式 Excel 内存:4G → 200M。 一、踩坑现场:传统导出为什么 OOM 1.1 传统写法 @Service public class OrderExportService { @Autowired private OrderMapper orderMapper; /** * 运....