mysql8之单次查询结果太大
MyBatis-Plus 大结果集查询导致 OOM 彻底解决方案
(生产实战版,100% 解决百万数据查询 OOM)
一、问题本质
你遇到的是:
MyBatis/MyBatis-Plus 默认会把整个结果集一次性加载到 JVM 内存中
→ 结果集 10w、50w、100w 条 → 内存直接撑爆 → OOM
二、核心解决方案:流式查询 + 游标 fetchSize
不一次性加载全部数据,而是数据库边发,应用边读,读一条处理一条
内存只占用一条数据的大小,多大结果集都不会 OOM。
MyBatis / MyBatis-Plus 原生支持,不需要改 SQL,不需要分页。
三、3 种生产可用方案(从简单到最强)
方案 1:MyBatis-Plus 流式查询(最简单,推荐)
步骤 1:Mapper 接口(用 MP 自带)
@MapperpublicinterfaceUserMapperextendsBaseMapper<User>{// 流式查询:必须用 ResultHandler 接收voidselectAllLargeData(@Param("query")QueryWrapper<User>queryWrapper,ResultHandler<User>handler);}步骤 2:Mapper XML
<selectid="selectAllLargeData"resultType="com.xxx.User"fetchSize="1000">select * from user<where>${query.sqlSegment}</where>