Spring Batch 并行读取数据库

Posted

技术标签:

【中文标题】Spring Batch 并行读取数据库【英文标题】:Spring Batch Parallel reading from DB 【发布时间】:2020-08-15 15:30:23 【问题描述】:

如何在 Spring Batch 中实现从 DB 并行读取?

根据https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html,我可以实现多线程步骤,但是,我必须为我的读者实现 SynchronizedItemStreamReader。因此,我对 DB 的所有查询都是连续的。

【问题讨论】:

你想并行读取或处理什么? 每个块都在新线程中执行,但读取器 doRead() 的方法是同步的。这意味着我只能在处理器和编写器中并发执行。我的目标是在非同步模式下阅读。 【参考方案1】:

JdbcCursorItemReader 不是线程安全的,因为它包装了一个非线程安全的ResulSet。这就是为什么在多线程环境下你需要synchronized访问就可以了。

另一方面,JdbcPagingItemReader 是线程安全的。当使用多个线程时,每个块都在它自己的线程中执行。如果您已将页面大小配置为与提交间隔匹配,则意味着每个页面都在同一个线程中处理。

现在大多数时候我们需要缩放而不是在处理和写入时而不是在读取期间。通常,读取速度足以支持我们的可扩展性需求。 但正如我所说,如果你真的需要这个,你应该使用开箱即用的分页阅读器或编写你自己的线程安全阅读器。

【讨论】:

以上是关于Spring Batch 并行读取数据库的主要内容,如果未能解决你的问题,请参考以下文章

spring batch读取数据库怎么用

Spring-batch学习总结—ItemReader普通文件,数据库,XML,多文件数据读取

Spring Batch -扩展和并行处理

Spring Batch中如何读取多个CSV文件合并数据进行处理?

利用spring batch 读取数据库中的数据写入到txt文件中

如何在 Spring Batch 中分别读取平面文件头和正文