6

我有 2 个不同的数据源,一个用于读取,另一个用于写入结果,如下所示:

  • ItemReader 应该从 dataSource_1 获取数据。
  • ItemWriter 应该将数据写入 dataSource_2。

知道 reader 和 writer 在同一个 tasklet 中。

根据文档,我们可以在 tasklet 中配置单个事务管理器

在这种情况下,我如何在这里使用事务管理器?

我不能依赖容器并且我没有使用 ORM 层(JPA ..),我使用直接 JDBC 驱动程序读取数据库 1 并写入数据库 2。

当前配置:

<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${batch.or.jdbc.driver}" />
    <property name="url" value="${batch.or.jdbc.url}" />
    <property name="username" value="${batch.or.jdbc.user}" />
    <property name="password" value="${batch.or.jdbc.password}" />
</bean>

<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${batch.caux.jdbc.driver}" />
    <property name="url" value="${batch.caux.jdbc.url}" />
    <property name="username" value="${batch.caux.jdbc.user}" />
    <property name="password" value="${batch.caux.jdbc.password}" />
</bean>

<bean id="baseReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
        <property name="dataSource" ref="dataSource1" />
</bean>

<bean id="baseWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
        <property name="dataSource2" ref="dataSource2" />
        <property name="sql" value="${batch.param.insert}" />
</bean>

我如何使用 Spring Batch 配置 JTA/XA 事务(Atomikos)?

4

3 回答 3

2

您将需要为您的 2 个数据源使用 XA 兼容驱动程序和 JTA 事务管理器。

如果您不熟悉分布式事务,请参阅这篇文章和这篇文章

问候

于 2013-05-29T15:35:39.497 回答
1

如果读取器可以在事务之外,则只能使用写入器的 trx 管理器。如果您在同一个事务中需要读取器和写入器,那么您可能需要一个与 XA 兼容的事务管理器。

于 2013-05-29T23:56:45.077 回答
0

忘记 Spring Batch。

假设您需要编写一个应用程序服务,它从一个 datasource1 读取并写入 datasource2,您需要做什么?

分布式事务是您的答案。这当然涉及额外的配置。如果您在 J2EE 容器(Websphere、Weblogic、JBoss 等)中,那么它们提供的事务管理器应该能够处理分布式事务。您应该能够在 Spring 中为这些平台中的每一个找到相应的 TransactionManager 实现。您只需将数据源(也应该在容器下)配置为使用 XA 感知驱动程序,并在您的应用程序中使用相应的事务管理器,并通过 JNDI 查找 XA 感知数据源

但是,如果您不能依赖容器(例如,您正在编写一个独立的应用程序等),您将需要找到一个有能力的事务管理器。 Atomikos是最著名的免费 JTA/XA 库之一。

当然,如果您百分百确定所有事务感知操作都将在 datasource2 中,您可以考虑仅对 datasource2 使用 datasource 事务管理器,但老实说,这不是我建议的首选方法。

于 2013-05-30T01:34:43.947 回答