Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring batch 如何在spring批处理读取器中逐块读取多个数据库_Spring Batch - Fatal编程技术网

Spring batch 如何在spring批处理读取器中逐块读取多个数据库

Spring batch 如何在spring批处理读取器中逐块读取多个数据库,spring-batch,Spring Batch,我正在开发一个spring批处理作业,需要从4个不同的数据库(不同的服务器)读取数据 过程是这样的 1) 从db1读取记录 2) 使用db2中的信息过滤少量 3) 用db3中的信息过滤更多的内容 4) 用db4中的信息过滤更多的内容 5) 将过滤后的记录保存到db5 我的方法 对于从db1读取,我可以使用ItemReader(并在步骤中提供块值),然后使用多链处理器进行过滤,然后使用JpaItemWriter 我的方法有问题吗 我认为上述方法的问题是,假设我从db1中获得100000条记录,我需

我正在开发一个spring批处理作业,需要从4个不同的数据库(不同的服务器)读取数据

过程是这样的

1) 从db1读取记录

2) 使用db2中的信息过滤少量

3) 用db3中的信息过滤更多的内容

4) 用db4中的信息过滤更多的内容

5) 将过滤后的记录保存到db5

我的方法 对于从db1读取,我可以使用ItemReader(并在步骤中提供块值),然后使用多链处理器进行过滤,然后使用JpaItemWriter

我的方法有问题吗 我认为上述方法的问题是,假设我从db1中获得100000条记录,我需要查询db2、db3、db4 100000次,因为每个项都将调用ItemProcessor

可能的解决办法 1) 我认为,若为每个记录块而不是一条记录调用处理器,那个么问题就会得到解决

2) 或者,如果我可以链接spring读卡器,这样一个读卡器将数据(逐块)传递给另一个读卡器,在那里我可以根据其他数据库中的信息进行过滤,最后传递给处理器

但我不确定是否能够找到一种方法来实现我想到的上述解决方案

这些解决方案足够好吗?如果是,我如何实施这些方案

或者有没有其他方法来实现这一点

编辑:这是一个可能的重复,但该问题的解决方案不会解决我的问题


因为我有两个以上的数据库要读取,而且如果我用writer的write方法编写过滤逻辑,这看起来像是一种黑客行为,因为writer不适合进行任何数据充实/过滤。

您描述的模式的可能副本称为where one(或多个)item processor用于使用附加数据(例如,来自另一个数据源)丰富/过滤项目。这种模式确实会带来一些性能问题,因为它需要对每个项进行额外的查询
我认为,如果为每个记录块而不是1条记录调用处理器,问题就会得到解决。
:这个答案可能会有所帮助:。@MahmoudBenHassine我看到了这个问题和答案。但我完全没有理解你。您是否建议我们可以在writer中编写过滤逻辑?不,我说应该在项目处理器中完成(
,其中一个(或多个)项目处理器用于丰富/过滤项目
)。但是,如果您想访问整个项目块,您需要在
ItemWriteListener#beforeWrite
中进行,因此它不在编写器中,而是在编写器之前的侦听器中。@adanilev在这种情况下,块处理模型可能不是您的最佳选择。当然,您可以找到一种使用它的方法,但它可能不是最好的方法。您描述的模式的可能副本称为项目处理器,其中一个(或多个)项目处理器用于使用附加数据(例如,来自另一个数据源)丰富/过滤项目。这种模式确实会带来一些性能问题,因为它需要对每个项进行额外的查询
我认为,如果为每个记录块而不是1条记录调用处理器,问题就会得到解决。
:这个答案可能会有所帮助:。@MahmoudBenHassine我看到了这个问题和答案。但我完全没有理解你。您是否建议我们可以在writer中编写过滤逻辑?不,我说应该在项目处理器中完成(
,其中一个(或多个)项目处理器用于丰富/过滤项目
)。但是,如果您想访问整个项目块,您需要在
ItemWriteListener#beforeWrite
中进行,因此它不在编写器中,而是在编写器之前的侦听器中。@adanilev在这种情况下,块处理模型可能不是您的最佳选择。当然你可以找到一种使用它的方法,但它可能不是最好的方法。