“结果集内存溢出”通常是指程序从数据库(或其他数据源)查询返回的数据量过大,直接加载到内存中,导致 JVM / 进程内存被撑爆(OutOfMemoryError)。下面从常见原因 → 典型场景 → 解决方案系统说明。
List<User> users = userMapper.selectAll(); // 几百万条
✅ 这是最常见原因
ResultSet 会缓存在客户端SELECT * FROM order
LIMIT 1000000, 100000;
List<BigObject> list = new ArrayList<>();
while (rs.next()) {
list.add(new BigObject(rs));
}
| 框架 | 风险点 |
|---|---|
| MyBatis | 默认非流式 |
| Hibernate | 一级缓存 |
| Spring Data | 默认分页不全 |
java.lang.OutOfMemoryError: Java heap space
或:
GC overhead limit exceeded
<select id="selectLarge"
resultSetType="FORWARD_ONLY"
fetchSize="1000">
select * from user
</select>
@Select("select * from user")
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
void selectLarge(ResultHandler<User> handler);
int page = 0;
while (true) {
List<User> list = mapper.selectPage(page, 1000);
if (list.isEmpty()) break;
process(list);
page++;
}
✅ 内存恒定
SELECT user_id, COUNT(*)
FROM order
GROUP BY user_id;
SELECT id, name FROM user
❌ 避免 SELECT *
-Xmx4g -Xms4g
⚠️ 只适合临时缓解
结果集内存溢出 = 数据量 > 内存容量 + 错误加载方式
✅ 正确姿势:
如果你能告诉我:
我可以直接给你可落地的改法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。