You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Batch读取500万条记录表报错,是否存在读取行数上限?

问题结论

Spring Batch本身没有内置的读取行数上限,你遇到的报错和框架的行数限制无关,是JdbcCursorItemReader的游标加载机制导致的。

报错原因

你当前使用的JdbcCursorItemReader默认会把全量查询结果一次性加载到JVM内存中:

  • 当执行select * from table查询500万全量数据时,全量结果集加载需要消耗极大内存,等待18分钟后要么触发了数据库查询超时主动断开了连接,要么JVM内存不足导致创建游标时返回空对象,最终抛出openCursor位置的空指针异常
  • 添加limit 10000后返回的结果集很小,可以在超时/内存不足前完成加载,所以程序运行正常

优化方案

  1. 推荐直接替换使用JdbcPagingItemReader:采用分页查询的方式分批拉取数据,不需要一次性加载全量结果集,天然适配百万级以上大数据量的读取场景
  2. 如果要继续使用JdbcCursorItemReader,需要做如下配置调整:
  • 调用setFetchSize(int)方法设置每次从数据库拉取的批次行数,避免全量结果集加载
  • 调高数据库连接的查询超时时间,同时放大JVM堆内存上限,保证大结果集查询过程中连接不会中断、内存足够承载中间数据

内容的提问来源于stack exchange,提问作者carlos palma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:42:00