Frage

Ich habe eine applicationContext.xml-Datei, und es hat zwei org.springframework.orm.jpa.JpaTransactionManager (jede mit ihrer eigenen Persistenzeinheit, verschiedene Datenbanken) in einer Frühlings-Middleware benutzerdefinierte Anwendung konfiguriert.
Ich möchte Annotation basierte Transaktionen verwenden (@Transactional), nicht Kampf mit Transaction begehen, speichern und Rollbacks.
Ein Mitarbeiter erwähnt, dass etwas wird diese verwirrt tun, wenn es mehrere Transaktionsmanager sind, auch wenn der Kontext-Datei richtig konfiguriert gesetzt (die Verweise auf die richtige Persistenzeinheit gehen. Wer jemals ein Problem sehen?


In der Config, würden Sie haben zwei Transaktionsmanager? Würden Sie haben txManager1 und txManager2?
Das ist, was ich habe mit JPA, zwei verschiedene Spring-Beans, die Transaktionsmanager sind.

War es hilfreich?

Lösung

Ich denke, Sie haben die Wahl zwischen 2

Wenn Ihre Anwendungsfälle nie innerhalb derselben Transaktion für beide Datenbanken Updates benötigen, dann können Sie zwei JpaTransactionManagers verwenden, aber ich bin nicht sicher, ob Sie in der Lage sein wird, den @Transactional Ansatz zu benutzen? In diesem Fall müßten Sie auf dem älteren Mechanismus mit einem einfachen TransactionProxyFactoryBean Transaktionsgrenzen zu definieren, zum Beispiel:

<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 benötigen beide Datenbanken Spanning, dann benötigen Sie einen JTA Transaktionsmanager zu verwenden. Die API Staaten :

  

Das Transaktionsmanager ist für Anwendungen geeignet, die eine einzelne JPA EntityManagerFactory für den Transaktionsdatenzugriff verwenden. JTA (in der Regel durch JtaTransactionManager) ist für den Zugriff auf mehrere Transaktionsressourcen innerhalb derselben Transaktion erforderlich. Beachten Sie, dass Sie Ihre JPA-Provider konfigurieren müssen entsprechend, um es in JTA-Transaktionen zu machen teilnehmen.

Was dies bedeutet ist, dass Sie einen JTA Transaktionsmanager bereitstellen müssen. In unserer Anwendung verwenden wir Config ähnlich der folgenden:

<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 JtaTransactionManager eine Lookup auf den realen XA-konformen JTA Transaktionsmanager von den appserver bereitgestellt tun muss. Sie können aber auch ein eigenständigen JTA Transaktionsmanager verwenden (aber ich habe nicht das selbst noch nicht ausprobiert)

Wie für die JPA Persistenz-Provider konfigurieren, bin ich nicht so vertraut. Welche JPA Persistenz-Provider verwenden Sie?

Der obige Code basiert auf unseren Ansatz, wo wir einheimische Hibernate wurden unter Verwendung im Gegensatz der JPA-Implementierung Hibernate. In diesem Fall konnten wir loswerden der beiden HibernateTransactionManager Bohnen bekommen, und einfach sicherzustellen, dass beide SessionFactories mit dem gleichen JTA TM injiziert wurden, und verwenden Sie dann den tx: annotation-driven Element

.

Hope, das hilft

Andere Tipps

Die einzige Situation, in der Sie zwei Federtransaktionsmanager haben kann, ist, wenn Sie beide Transaktionen nie auf einmal geöffnet haben. Dies ist an sich nicht mit verteilten Transaktionen zu tun -. Die gleichen Einschränkungen gelten auch, wenn Sie die beiden Datenquellen wollen völlig getrennt haben (aber möglicherweise zeitlich überlappend) Transaktion lifecyles

Intern Spring Transaktionsmanager verwenden alle Spring TransactionSynchronizationManager, die eine Reihe von kritischen Zustand in statischen Variablen Thread hält, so Transaktionsmanager sind garantiert alle über jeweils anderen Zustand stampfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top