Multithreading Spring批处理中的并行处理

Multithreading Spring批处理中的并行处理,multithreading,spring,spring-batch,Multithreading,Spring,Spring Batch,我有一批正在做以下操作 步骤1:使用存储过程读取数据库,并使用MultiResourceItemWriter写入多个文件 步骤2:使用MultiResourceItemReader读取文件,进行一些处理并写入另一个数据库。此步骤使用MultiResourcePartitioner进行并行化 现在,为了获得更好的性能,我想将步骤1和步骤2并行化,以便在步骤1完成文件写入时,步骤2将获取该文件并开始处理。实现这一目标的最佳方式是什么。我找不到合适的方法来确定文件写入完成的时间点,因此我需要执行一些操

我有一批正在做以下操作

步骤1:使用存储过程读取数据库,并使用MultiResourceItemWriter写入多个文件

步骤2:使用MultiResourceItemReader读取文件,进行一些处理并写入另一个数据库。此步骤使用MultiResourcePartitioner进行并行化


现在,为了获得更好的性能,我想将步骤1和步骤2并行化,以便在步骤1完成文件写入时,步骤2将获取该文件并开始处理。实现这一目标的最佳方式是什么。我找不到合适的方法来确定文件写入完成的时间点,因此我需要执行一些操作,例如重命名/移动文件,以便在第二步中可以拾取该文件。

第1步是不必要的。正如@KaPra提到的,您可以根据范围使用分区器来拆分db记录。

可能适用于您的情况,或者使用自定义分区程序,该程序将定义要存储在stepExecutionContext中的记录范围,以便您可以使用或类似的方法读取每个分区。
结果将与您当前的作业完全相同,减少了创建文件然后处理它们的瓶颈。

为什么不一步读、处理和写呢。使用分区,您可以从1-1000个从属步骤读取数据,并对其进行处理,然后将其标记到数据库中。类似地,在另一个从属步骤1001-2000中,依此类推。因此,可以消除文件IO的开销。复杂性取决于查询的形成。您可以参考pageitemreader如何读取数据块。此查询需要作为分区的一部分。我选择创建文件,因为我一直在修改步骤1中选择的一些数据,这是步骤2的一部分。如果我不使用文件,我必须保持数据库连接打开,直到所有读取完成,我不能更新,因为数据库中的这些记录有一个锁。希望这是清楚的,您可以创建Itemprocessor来修改数据(因此不会有任何影响)。我不认为您锁定了整个表(我假设您的业务逻辑是从tableA流程读取数据并将数据更新回tableA)。锁定仅应用于正在读取的行。您可以删除SP。我选择创建该文件,因为作为步骤2的一部分,我一直在修改步骤1中选择的一些数据。如果我不使用文件,我必须保持数据库连接打开,直到所有读取完成,我不能更新,因为数据库中的这些记录有一个锁。希望这是清楚的