“Cursor 游标为什么会内存溢出”这个问题,通常指在使用**数据库游标(Cursor)**或某些编程里的游标对象时,程序出现 OutOfMemory(OOM)。下面从原理和常见原因讲清楚。
游标(Cursor)本质上是一个结果集的遍历指针,理论上:
但内存溢出往往不是游标本身,而是“怎么用游标”导致的。
List<User> list = cursor.fetchAll(); // ❌
List✅ 正确做法:
while (cursor.hasNext()) {
User u = cursor.next();
process(u);
}
Cursor cursor = dao.query();
// 忘了 cursor.close();
✅ 使用 try-with-resources:
try (Cursor cursor = dao.query()) {
...
}
List<User> all = new ArrayList<>();
while (cursor.hasNext()) {
all.add(cursor.next()); // ❌
}
SELECT * FROM files
✅ 解决:
BEGIN;
DECLARE cursor;
-- 跑了 1 小时
COMMIT;
✅ 控制事务粒度,避免“一个游标跑全天”
比如:
fetchSize 没设ScrollableResults 没用对Stream 被中间操作强制求值结果:
看起来是游标,其实是全量查询
某些数据库(如 Oracle、SQL Server):
表现为:
✅ 核心原则:游标 = 流式处理,不是容器
实战建议:
fetchSizecloseSELECT *你可以直接贴代码或报错信息。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。