Oui, vous pouvez utiliser un gestionnaire de transactions compatible JTA comme Atomikos ou Bitronix. Leurs sites respectifs contiennent de la documentation sur la façon de les configurer avec Spring. En général, vous devrez suivre les étapes ci-dessous (si vous utilisez Atomikos) :
- Conservez votre source de données XA existante (
rtsDatasource
dans votre cas) ou créez-en une si vous ne l'utilisez pas déjà (par exemple, si quelqu'un a une source de données non-XA, cette source de données doit d'abord être convertie en une source de données XA). - Enveloppez la source de données XA dans un
AtomikosDataSourceBean
. - Pointez votre
EntityManagerFactory
au nouveauAtomikosDataSourceBean
exemple. - Déclarez un gestionnaire de transactions XA et une transaction utilisateur XA.
- Enveloppez le gestionnaire de transactions XA dans un Spring
JtaTransactionManager
. - Utiliser le Spring
JtaTransactionManager
.
Un court extrait de configuration utilisant la base de données H2, Hibernate 4, Spring 4 et Atomikos 4 est présenté ci-dessous.
<bean class="org.h2.jdbcx.JdbcDataSource" id="originalDataStore" lazy-init="true">...</bean>
<bean class="com.atomikos.jdbc.AtomikosDataSourceBean" id="dataSource" init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="xaDS"/>
<property name="xaDataSource" ref="originalDataStore"/>
<property name="poolSize" value="3"/>
</bean>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="dataSource" ref="dataSource"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.transaction.jta.platform">com.atomikos.icatch.jta.hibernate4.AtomikosPlatform</prop>
...
</props>
</property>
</bean>
<bean class="org.springframework.transaction.jta.JtaTransactionManager" id="transactionManager">
<property name="transactionManager">
<bean class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
<property name="forceShutdown" value="false"/>
</bean>
</property>
<property name="userTransaction">
<bean class="com.atomikos.icatch.jta.J2eeUserTransaction">
<property name="transactionTimeout" value="300"/>
</bean>
</property>
<property name="allowCustomIsolationLevels" value="true"/>
</bean>
<transaction:annotation-driven transaction-manager="transactionManager"/>
Pour plus de détails, vous pouvez voir cette application .