Как настроить один диспетчер транзакций для нескольких источников данных (три базы данных оракула)?

Мой проект находится в 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> 

person user3615185    schedule 23.09.2015    source источник


Ответы (1)


Да, это возможно, но вы должны изменить несколько вещей. Вам нужен глобальный менеджер транзакций, поддерживающий двухэтапную фиксацию. Вы можете использовать реализацию 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.

person Ricardo Vila    schedule 23.09.2015
comment
Спасибо :-). Я хочу использовать jtaTransactionManager. Я совершенно новичок в весенней партии. Любая идея о том, как настроить его в данных конфигурации, которыми я поделился... - person user3615185; 23.09.2015
comment
Этот пост в блоге (spring .io/blog/2011/08/15/) содержит раздел для использования JTA вне сервера приложений Java EE. Возможно, вам удастся добавить этот простой тег в конфигурацию ‹tx:jta-transaction-manager /›, но очень важно знать, что вы делаете, и какие есть альтернативы. - person Ricardo Vila; 23.09.2015