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

Spring Batch多线程场景下MyBatisCursorItemReader空指针异常问题

问题根本原因

MyBatisCursorItemReader 本身不支持多线程运行,不是你的配置错误。

原因说明

  • 基于游标实现的ItemReader底层绑定了单个数据库连接和ResultSet对象,而JDBC的ResultSet本身是非线程安全的组件,多个线程同时读取同一个结果集时,会互相干扰游标位置,甚至出现部分线程读完后主动关闭连接/结果集,其他线程仍在尝试读取的情况
  • 你遇到的空指针异常就是结果集实例被提前释放或者游标位置错乱,导致读取列属性时找不到对应结果集对象导致的
  • Spring Batch官方文档也明确标注,所有游标类ItemReader实现默认都是非线程安全的,不能直接搭配多线程TaskExecutor使用
可行的解决方案

1. 替换为MyBatisPagingItemReader(最便捷)

分页查询的实现天然线程安全,每个线程读取独立的分页数据,不会共享同一个ResultSet,只需调整Reader的配置即可使用,注意合理设置分页大小避免数据重复或漏读。

2. 为读取操作加同步锁(不推荐)

可以给MyBatisCursorItemReader的read方法加锁强制串行读取,但这样会抵消多线程的性能优势,仅适合小数据量临时调整使用。

3. 改用分区Step(性能最优)

为每个分区单独初始化一个MyBatisCursorItemReader实例,每个分区对应独立的查询条件和数据库连接,各自读取自己负责的分片数据,既保留了游标读取的低内存占用优势,又能实现多线程并行处理,适合大数据量批量作业场景。

内容的提问来源于stack exchange,提问作者cos beck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:45:02