如何为多个数据源(三个oracle dbs)配置单个事务管理器?

时间:2015-09-23 07:37:25

标签: spring oracle datasource spring-batch transactionmanager

我的项目是Spring Batch。我正在为三个不同的数据源使用三个事务管理器。在这里,我遇到的问题是,如果在其中一个db持久性中发生故障,则仅在该数据源上执行Rollback,而不在其他两个数据源上执行。我想同步所有数据源,以便回滚将完成所有这三个。是否可以为所有三个数据源提供单个事务管理器?是这样,如何配置?请有人帮我这个。在下面找到我的配置详情,

<bean id="firstDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" primary="true">
        <property name="driverClassName" value="${jdbc.first.driver}" />
        <property name="url" value="${jdbc.first.url}" />
        <property name="username" value="${jdbc.first.username}" />
        <property name="password" value="${jdbc.first.password}" />
        <property name="removeAbandoned" value="true" />
        <property name="initialSize" value="${jdbc.initial.pool.size}" />
        <property name="maxActive" value="${jdbc.max.active}" />
    </bean>

    <bean id="secondDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.second.driver}" />
        <property name="url" value="${jdbc.second.url}" />
        <property name="username" value="${jdbc.second.username}" />
        <property name="password" value="${jdbc.second.password}" />
        <property name="removeAbandoned" value="true" />
        <property name="initialSize" value="${jdbc.initial.pool.size}" />
        <property name="maxActive" value="${jdbc.max.active}" />
    </bean>

    <bean id="thirdDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.third.driver}" />
        <property name="url" value="${jdbc.third.url}" />
        <property name="username" value="${jdbc.third.username}" />
        <property name="password" value="${jdbc.third.password}" />
        <property name="removeAbandoned" value="true" />
        <property name="initialSize" value="${jdbc.initial.pool.size}" />
        <property name="maxActive" value="${jdbc.max.active}" />
    </bean>


<bean id="firstTransactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="firstDataSource" />
    </bean>

    <bean id="secondTransactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="secondDataSource" />
    </bean>

    <bean id="thirdTransactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="thirdDataSource" />
    </bean> 

1 个答案:

答案 0 :(得分:1)

是的,有可能但你必须改变一些事情。 您需要一个能够2-phase-commit的全局事务管理器。您可以使用支持Atomikos,Spring的JtaTransactionManager或JBoss JTA支持的JTA实现。 我在Spring和JPA(Hibernate实现)中使用了最后一个,在这种情况下,配置起来非常方便。 您只需要告诉Hibernate事务管理器将是JBoss JTA实现:

<prop key="hibernate.transaction.jta.platform">
  org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform
</prop>

请记住,对于两阶段提交,您需要将数据源更改为XA数据源。