Ja, u zou een JTA-conforme transactiemanager zoals Atomikos of Bitronix kunnen gebruiken. Hun respectievelijke sites hebben documentatie over hoe ze te configureren met Spring. Over het algemeen moet u de onderstaande stappen volgen (als u Atomikos gebruikt):
- Behoud uw bestaande XA-gegevensbron (
rtsDatasource
in uw geval) of maak er een aan als u deze nog niet gebruikt (als iemand bijvoorbeeld een niet-XA-gegevensbron heeft, moet die gegevensbron eerst worden geconverteerd naar een XA-gegevensbron). - Wikkel de XA-gegevensbron in een
AtomikosDataSourceBean
. - Richt uw
EntityManagerFactory
bij de nieuweAtomikosDataSourceBean
instantie. - Declareer een XA-transactiebeheerder en een XA-gebruikerstransactie.
- Wikkel de XA-transactiemanager in een Spring
JtaTransactionManager
. - Gebruik de Spring
JtaTransactionManager
.
Een kort configuratiefragment met H2-database, Hibernate 4, Spring 4 en Atomikos 4 wordt hieronder weergegeven.
<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"/>
Voor details kun je deze app bekijken .