2

我正在用Spring Batch编写大量批量作业,这些批量作业主要是从数据库导出/导入数据库。 Spring Batch作业存储库数据库和目标数据库(来自/我读/写数据)位于不同的机器上。春季批次中的XA交易

我的问题是我应该在此配置中使用XA事务吗?

我想知道在某些时候连接到作业存储库数据库刹车的场景,它是否会潜在地破坏数据?就像这样:

  1. 工作启动(写入工作资料库)
  2. 读/流程/事务中的目标DB写入
  3. 链接到工作仓库分贝刹车和作业失败

最后我更新了目标数据库,但作业失败,因此在作业重新启动时将再次处理相同的数据。

回答

1

Spring Batch在其读写器中具有禁用临时状态保存的功能(您将属性saveState设置为false)。这允许您独立于Spring Batch JobRepository来管理处理的状态。

在您的示例中,您将在读取的表上维护“已处理标志”,并将选择语句修改为select * from x where processed = false。这会使你不太依赖JobRepository的状态。

看看http://static.springsource.org/spring-batch/reference/html/readersAndWriters.html#process-indicator更详细地解释它。

+0

这将有所帮助,但问题是我无法修改读取表结构。 – Vladimir

+0

所以我们回到了jobRepository设计的目的;在没有另一种机制的情况下保持状态。我的建议是通过一个监听器保存一个线性的,非事务性的状态日志,或者如果它们成为JobRepository上的失败,可以用来协调。这将允许您在出现非常规故障的情况下进行协调和处理。 –