Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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
Java Spring批处理如何管理事务(可能有多个数据源)?_Java_Transactions_Spring Batch - Fatal编程技术网

Java Spring批处理如何管理事务(可能有多个数据源)?

Java Spring批处理如何管理事务(可能有多个数据源)?,java,transactions,spring-batch,Java,Transactions,Spring Batch,我想要一些关于Spring批处理中的数据流的信息,但是在互联网上找不到我想要的(尽管在这个网站上) 我正试图在我们公司建立使用SpringBatch的标准,我们想知道当一个步骤中的多个处理器更新不同数据源上的数据时,SpringBatch的行为如何 这个问题的重点是一个分块的过程,但请随意提供其他模式的信息 据我所见(如果我错了,请纠正我),当一行被读取时,它在下一行被读取之前遵循整个流程(读卡器、处理器、写入器)(与思洛存储器处理相反,在思洛存储器处理中,读卡器将处理所有行,将它们发送给处理器

我想要一些关于Spring批处理中的数据流的信息,但是在互联网上找不到我想要的(尽管在这个网站上)

我正试图在我们公司建立使用SpringBatch的标准,我们想知道当一个步骤中的多个处理器更新不同数据源上的数据时,SpringBatch的行为如何

这个问题的重点是一个分块的过程,但请随意提供其他模式的信息

据我所见(如果我错了,请纠正我),当一行被读取时,它在下一行被读取之前遵循整个流程(读卡器、处理器、写入器)(与思洛存储器处理相反,在思洛存储器处理中,读卡器将处理所有行,将它们发送给处理器,等等)

在我的例子中,几个处理器读取数据(在不同的数据库中)并在过程中进行更新,最后写入程序将数据插入另一个数据库。目前,JobRepository没有链接到数据库,但这将是一个独立的数据库,这使得事情仍然有点复杂

此模型无法更改,因为数据属于多个业务领域

在这种情况下,如何管理事务?是否只有在处理完整个数据块后才提交数据?然后,是否有两阶段提交管理?如何确保?应进行哪些开发或配置以确保数据的一致性


更一般地说,在类似的情况下,您的建议是什么?

Spring批处理使用Spring核心,大多数事务语义围绕项目块进行安排,如第5.1节所述

读写器的事务行为完全取决于它们是什么(例如文件系统、数据库、JMS队列等),但是如果资源配置为支持事务,那么spring将自动登记它们。XA也是如此-如果您使资源端点与XA兼容,那么它将使用2阶段提交

回到区块事务,它将在区块的基础上设置一个事务,因此如果您在给定的tasklet上将提交间隔设置为5,那么它将根据设置的读取次数(定义为提交间隔)打开和关闭一个新事务(包括事务管理器管理的所有资源)


但所有这些都是围绕从单个数据源读取数据而设置的,这是否满足您的要求?我不确定SpringBatch是否能够管理一个事务,它从多个源读取数据,并在单个事务中将处理器结果写入另一个数据库。(事实上,我想不出有什么能做到这一点……

谢谢你的回答。我们将不得不面对多个数据库的情况(每个业务部门都有自己的数据库,我们有时需要访问多个业务元素)。不过这些都是有用的元素。是的,我在考虑这个问题,你必须对它进行结构化,使事件来自单个源,流程步骤可能会查询各种数据库(这将发生在已建立的事务中),然后更新目标数据库。或者让某个东西聚合来自不同生产者的事件,然后让一个处理器实际执行更新。