Java 使用2个不同的数据源:Spring批处理

Java 使用2个不同的数据源:Spring批处理,java,spring,spring-batch,Java,Spring,Spring Batch,我有两个不同的数据源,一个用于读取,另一个用于写入结果,如下所示: ItemReader应该从数据源_1获取数据 ItemWriter应将数据写入dataSource_2 知道读者和作者在同一个任务中 根据文档,我们可以在tasklet上配置单个事务管理器 在这个场景中,如何在这里使用事务管理器 我不能依赖容器,也没有使用ORM层(JPA..),我使用直接JDBC驱动程序读取数据库1并写入数据库2 当前形态: <bean id="dataSource1" class="org.apac

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

  • ItemReader应该从数据源_1获取数据
  • ItemWriter应将数据写入dataSource_2
知道读者和作者在同一个任务中

根据文档,我们可以在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)?

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

如果您不熟悉分布式事务,请参阅此和此


关于

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

忘记Spring批处理

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

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

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

当然,如果您百分之百地确信所有的事务感知行为都将在DATSURCE2中,您可以考虑仅使用DATA Suffice事务管理器用于DATSUCURCE2,但老实说,这不是我推荐的首选方法。