2008-09-16 14 views
11

私は1つのapplicationContext.xmlファイルを持っていて、Springミドルウェアのカスタムアプリケーションで設定された2つのorg.springframework.orm.jpa.JpaTransactionManager(それぞれ独自の永続ユニット、異なるデータベースを持つ)を持っています。

注釈ベースのトランザクション(@Transactional)を使用して、TransactionStatusのコミット、保存、ロールバックを混乱させたくありません。

同僚は、複数のトランザクションマネージャが存在する場合に何かがコンテキストファイルを参照が正しい永続ユニットに移動(正しく設定設定されているにもかかわらず、これをやって混同されることを述べた。 誰もが今まで問題を参照してください?JPA複数のトランザクションマネージャ


お使いの設定で

、次の2つのトランザクションマネージャを持っているでしょう? あなたはtxManager1とtxManager2を持っていますか?

、私はJPAを持っているもののトランザクションマネージャ2つの異なるのSpring Beanです。

答えて

9

2つの選択肢があると思います

ユースケースで同じトランザクション内で両方のデータベースを更新する必要がない場合は、2つのJpaTransactionManagersを使用できますが、@Transactionalアプローチを使用できるかどうかはわかりません?このケースでは、例えば、トランザクション境界を定義するために、単純なTransactionProxyFactoryBeanを使用して、以前のメカニズムにフォールバックする必要があります:

<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 --> 

あなたが両方のデータベースにまたがるトランザクションを必要としている場合、あなたはJTAを使用する必要がありますトランザクションマネージャ。 APIの状態は次のとおりです。

このトランザクションマネージャは、トランザクションデータアクセス用に1つのJPA EntityManagerFactoryを使用するアプリケーションに適しています。同じトランザクション内の複数のトランザクション・リソースにアクセスするには、JTA(通常はJtaTransactionManagerを使用)が必要です。 JPAプロバイダがJTAトランザクションに参加するには、JPAプロバイダを適切に設定する必要があることに注意してください。

これは、JTAトランザクションマネージャを提供する必要があることを意味します。

<tx:annotation-driven transaction-manager="txManager"/> 

<bean id="txManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManagerName" value="appserver/jndi/path" /> 
</bean> 

あなたがアプリケーションサーバーの中に展開している場合は、その後、春JtaTransactionManagerは、アプリケーションサーバーが提供する本物のXA準拠のJTAトランザクションマネージャに検索を実行する必要があります。我々のアプリケーションでは、我々は次のような設定を使用します。しかし、スタンドアロンのJTAトランザクションマネージャを使用することもできます(まだ私自身はこれを試していません)。

Jpa永続性プロバイダの設定に関しては、あまりよく知られていません。どのJPA永続性プロバイダを使用していますか?

上記のコードは、HibernateのJPA実装とは対照的にネイティブなHibernateを使用していた我々のアプローチに基づいています。この場合、2つのHibernateTransactionManager Beanを取り除き、両方のSessionFactoriesに同じJTA TMが注入されていることを確認してから、tx:annotation-driven要素を使用することができました。あなたが一度にオープントランザクションの両方を持っていることはありませんならば、これは

+0

複数のデータベースでjtaTransactionのサンプルコードまたはPOCを提供できますか? – dhroove

+0

[Atomikosを使用したTomcatのJTA複数リソーストランザクションの例](http://www.javacodegeeks.com/2013/07/spring-jta-multiple-resource-transactions-in-tomcat-with-atomikos-example.html) – anasanjaria

3

を助け

希望は、2つの春のトランザクションマネージャを持つことができる唯一の状況です。これは、分散トランザクションと本質的に関係するものではありません.2つのデータソースが完全に別々の(ただし時間的にオーバーラップする)トランザクションライフサイクルを持つ場合でも同じ制限が適用されます。

内部でSpringのトランザクションマネージャはすべてSpringのTransactionSynchronizationManagerを使用します。これは静的なThreadLocal変数に一連のクリティカルな状態を保持するため、トランザクションマネージャは互いの状態を全面的に揺るがすことが保証されます。

関連する問題