我想在
Spring批处理中提供有关数据流的一些信息,但无法在Internet上找到我正在寻找的内容(尽管本网站有
some useful questions).
我试图在我们公司中建立使用Spring Batch的标准,我们想知道当一些步骤中的几个处理器更新不同数据源上的数据时,Spring Batch如何表现.
这个问题集中在一个分块的过程,但随时提供其他模式的信息.
从我所看到的(如果我错了,请纠正我),当一行被读取时,它在下一个读取之前遵循整个流程(读取器,处理器,作者)(而不是读取器将处理的筒仓处理所有行,发送到处理器,等等).
在我的情况下,几个处理器读取数据(在不同的数据库中)并在进程中更新它们,最后写入程序将数据插入另一个数据库.现在,JobRepository没有链接到一个数据库,但这将是一个独立的,使事情仍然有点复杂.
该模型不能更改,因为数据属于多个业务领域.
在这种情况下,交易是如何管理的?数据是否仅在处理完整块之后才提交一次?那么,是否有两阶段提交管理?如何保证?为确保数据的一致性,应该采取哪些开发或配置?
更一般来说,你的建议在类似的情况下是什么?
解决方法
Spring批量使用Spring Core
transaction management,大多数事务语义围绕一大堆项目排列,如第5.1
of the Spring Batch docs节所述.
读者和作者的交易行为取决于它们的完整内容(例如文件系统,数据库,JMS队列等),但是如果资源配置为支持事务,那么它们将被弹簧自动登记. XA也是如此 – 如果您使资源端点符合XA标准,那么它将使用2阶段提交.
回到块事务,它将以块为基础设置事务,所以如果在给定的tasklet中设置提交间隔为5,那么它将打开和关闭一个新的事务(包括由事务管理器管理的所有资源)对于设置的读取次数(定义为提交间隔).
但是,所有这些都是从单个数据源读取设置的,是否满足您的要求?我不知道Spring批处理可以管理从多个来源读取数据的事务,并将处理器结果写入单个事务中的另一个数据库. (其实我不能想到可以做的事情…)