Ich nehme an, Sie haben 2 Möglichkeiten
Wenn Ihre Use-Cases niemals Updates für beide Datenbanken innerhalb der gleichen Transaktion benötigen, dann können Sie zwei JpaTransactionManagers verwenden, aber ich bin mir nicht sicher, ob Sie den @Transactional-Ansatz verwenden können ? In diesem Fall müssten Sie auf der älteren Mechanismus der Verwendung eines einfachen TransactionProxyFactoryBean definieren Transaktionsgrenzen zu Rückfall, zB:
<bean id="firstRealService" class="com.acme.FirstServiceImpl"/>
<bean id="firstService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="firstJpaTm"/>
<property name="target" ref="firstRealService"/>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- similar for your second service -->
Wenn Sie eine Transaktion sind, benötigen beide Datenbanken Spanning, dann benötigen Sie einen JTA verwenden Transaktionsmanager. Die API Staaten:
Diese Transaktions-Manager ist für Anwendungen geeignet, die eine einzelne JPA EntityManagerFactory für die Transaktionsdatenzugriff verwenden. JTA (normalerweise über JtaTransactionManager) ist für den Zugriff auf mehrere Transaktionsressourcen innerhalb derselben Transaktion erforderlich. Beachten Sie, dass Sie Ihren JPA-Provider entsprechend konfigurieren müssen, damit er an JTA-Transaktionen teilnehmen kann.
Dies bedeutet, dass Sie einen JTA-Transaktionsmanager bereitstellen müssen. In unserer Anwendung verwenden wir Config ähnlich den folgend:
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="appserver/jndi/path" />
</bean>
Wenn Sie innerhalb eines appserver bereitstellen, dann der Feder muss JtaTransactionManager eine Lookup auf den realen XA-konformen JTA Transaktionsmanager von den appserver bereitgestellt tun. Sie können jedoch auch einen eigenständigen JTA-Transaktionsmanager verwenden (aber ich habe dies selbst noch nicht versucht)
Wie für die Konfiguration des Jpa-Persistenz-Providers bin ich nicht so vertraut. Welchen JPA-Persistenzanbieter verwenden Sie?
Der obige Code basiert auf unserem Ansatz, bei dem wir nativen Hibernate anstelle der JPA-Implementierung von Hibernate verwenden. In diesem Fall konnten wir die beiden HibernateTransactionManager-Beans loswerden und einfach sicherstellen, dass beide SessionFactories mit demselben JTA TM injiziert wurden, und dann das tx: annotation-driven-Element verwenden.
hoffe, das hilft
können Sie den Beispielcode oder POC von jtaTransaction mit mehreren Datenbanken bereitstellen? – dhroove
[Spring JTA mehrere Ressourcen-Transaktionen in Tomcat mit Atomikos Beispiel] (http://www.javacodegeeks.com/2013/07/spring-jta-multiple-resource-transactions-in-tomcat-with-atomikos-example.html) – anasanjaria