Spring Batch读取500万条记录表报错,是否存在读取行数上限?
问题结论
Spring Batch本身没有内置的读取行数上限,你遇到的报错和框架的行数限制无关,是JdbcCursorItemReader的游标加载机制导致的。
报错原因
你当前使用的JdbcCursorItemReader默认会把全量查询结果一次性加载到JVM内存中:
- 当执行
select * from table查询500万全量数据时,全量结果集加载需要消耗极大内存,等待18分钟后要么触发了数据库查询超时主动断开了连接,要么JVM内存不足导致创建游标时返回空对象,最终抛出openCursor位置的空指针异常 - 添加
limit 10000后返回的结果集很小,可以在超时/内存不足前完成加载,所以程序运行正常
优化方案
- 推荐直接替换使用
JdbcPagingItemReader:采用分页查询的方式分批拉取数据,不需要一次性加载全量结果集,天然适配百万级以上大数据量的读取场景 - 如果要继续使用
JdbcCursorItemReader,需要做如下配置调整:
- 调用
setFetchSize(int)方法设置每次从数据库拉取的批次行数,避免全量结果集加载 - 调高数据库连接的查询超时时间,同时放大JVM堆内存上限,保证大结果集查询过程中连接不会中断、内存足够承载中间数据
内容的提问来源于stack exchange,提问作者carlos palma
相关产品推荐
相关产品推荐

