【问题标题】:How to configure Single transaction manager for multiple Datasources(three oracle dbs)?如何为多个数据源(三个 Oracle 数据库)配置单个事务管理器?
【发布时间】:2015-12-20 10:09:00
【问题描述】:

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

<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> 

【问题讨论】:

    标签: spring oracle datasource spring-batch transactionmanager


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢:-)。我想使用 jtaTransactionManager。我对春季批次完全陌生。关于如何在我共享的配置数据中配置它的任何想法...
    • 这篇博文 (spring.io/blog/2011/08/15/…) 有一个部分用于在 Java EE 应用程序服务器之外使用 JTA。也许您可以将这个简单的标签添加到您的配置中 但了解您在做什么以及替代方案非常重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2019-07-02
    • 2014-05-27
    • 2017-11-14
    • 2016-09-25
    相关资源
    最近更新 更多