Spring Batch中HibernatePagingItemReader重复读取数据问题解决
问题原因
HibernatePagingItemReader并非线程安全的实现,当你为Step配置taskExecutor启用多线程处理时,多个线程会共享同一个Reader实例。这会导致Reader内部的分页状态(当前页码、分页偏移量等)被并发修改,最终出现重复读取同一批数据的问题。你设置的setSaveState(false)仅用于禁用重启时的状态恢复,无法解决线程安全问题。
解决方案
为你的ItemReader Bean添加@StepScope注解,确保每个线程都能获取独立的Reader实例,避免并发访问导致的状态混乱。
修改后的myItemReader Bean定义:
@Bean @StepScope public ItemReader<X> myItemReader() { return new MyItemReader(sessionFactory, pageSize); }
原理说明
@StepScope是Spring Batch提供的作用域注解,它会让Spring在每个Step的执行上下文(每个线程)中创建一个新的Reader实例。每个独立的Reader实例会维护自己的分页状态,多个线程之间不会互相干扰,从而彻底避免重复读取同一数据的问题。
此外,你的AsyncItemProcessor和AsyncItemWriter配置无需调整,保持当前chunkSize与pageSize一致的设置是合理的,配合多线程TaskExecutor可以实现预期的并行处理效果。
内容的提问来源于stack exchange,提问作者Omeerfk
相关产品推荐
相关产品推荐

