0

私のプロジェクトはSpring Batchです。3 つの異なるデータ ソースに 3 つのトランザクション マネージャーを使用しています。ロールバックが 3 つすべてで行われるように、すべてのデータソースを同期したいと考えています。3 つのデータソースすべてに対して単一のトランザクション マネージャを使用することは可能ですか? そうですか、設定方法は?誰でもこれで私を助けてください。私の設定の詳細の下にある、

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

1 に答える 1

1

はい、可能ですが、いくつか変更する必要があります。2-phase-commitが可能なグローバル トランザクション マネージャーが必要です。Atomikos、Spring の JtaTransactionManager、JBoss JTA サポートなど、これをサポートする JTA 実装を使用できます。Spring と JPA (Hibernate 実装) で最後のものを使用しましたが、この場合は構成が非常に簡単です。トランザクションマネージャーが JBoss JTA 実装になることを Hibernate に伝える必要があるだけです。

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

2 フェーズ コミットでは、データソースを XA データソースに変更する必要があることに注意してください。

于 2015-09-23T08:27:54.167 に答える