你指的 Cursor(游标)批量读取,常见场景有几种,下面分别说明,你可以对号入座。
不要一次 fetchAll,用 Fetch Size 批量读:
Statement stmt = conn.createStatement();
stmt.setFetchSize(1000); // 每次从数据库拉 1000 条
ResultSet rs = stmt.executeQuery("SELECT * FROM user");
while (rs.next()) {
// 处理一行
}
✅ 本质:
数据库游标在服务端保持,客户端按批次取数据
cur.execute("SELECT * FROM user")
while True:
rows = cur.fetchmany(1000) # 批量读取
if not rows:
break
for row in rows:
pass
✅ 推荐用 fetchmany,而不是 fetchall
DECLARE
CURSOR c IS SELECT * FROM user;
TYPE t_arr IS TABLE OF user%ROWTYPE;
v_arr t_arr;
BEGIN
OPEN c;
LOOP
FETCH c BULK COLLECT INTO v_arr LIMIT 1000;
EXIT WHEN v_arr.COUNT = 0;
-- 批量处理
END LOOP;
CLOSE c;
END;
✅ BULK COLLECT LIMIT 是 Oracle 批量读取标准写法
{
"size": 1000,
"query": { "match_all": {} }
}
配合 scroll_id 或 search_after 分批拉
const cursor = db.collection.find().batchSize(1000);
while (await cursor.hasNext()) {
const doc = await cursor.next();
}
如 Python 生成器:
def batch_iter(data, size=1000):
for i in range(0, len(data), size):
yield data[i:i+size]
✅ 不要一次性加载全量
✅ 控制批次大小(1000–5000 常见)
✅ 服务端游标 + 客户端分批
✅ 处理完一批再取一批
如果你能告诉我:
我可以直接给你可运行示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。