3

Spring と Hibernate を使用して、JTA とのトランザクションを確立しています。PlatformTransactionManager は、narayana の TransactionManager および UserTransaction と結び付けられた JtaTransactionManager です。

@Bean
@Scope("prototype")
public TransactionManager jbossTransactionManager() {
    return jtaPropertyManager.getJTAEnvironmentBean().getTransactionManager();
}

@Bean
@Scope("prototype")
public UserTransaction jbossUserTransaction() {
    return jtaPropertyManager.getJTAEnvironmentBean().getUserTransaction();
}

@Bean
public PlatformTransactionManager transactionManager() {
    return new JtaTransactionManager(jbossUserTransaction(), jbossTransactionManager());
}

JtaTransactionManager には、必要な UT と TM があることに注意してください。JBoss 6 EAP では、DataSource が WrapperDataSource として使用されており、これが別の TM に関連していることに気付きました。具体的には、TransactionManagerDelegate を使用しています。これは、JNDI 名java:TransactionManagerおよびjava:jboss/TransactionManager. これにより、トランザクションがトランザクション境界を持つことができなくなり、フラッシュ時にデータがリークします。コンテナーから構成と UT および TM を削除すると、トランザクションは適切に処理されます。

  1. この他の TransactionManager を使用する決定は何ですか? これはコンテナーからの JCA のようですが、この決定のメカニズムがわかりません。
  2. UT と TM を削除し、コンテナーにコントロールを明け渡して、これらのコンポーネントをアプリに提供し、そのまま JTA プラットフォームに依存する必要がありますか?
4

1 に答える 1

0

コンテナは、データソースに JCA からのトランザクション マネージャを提供します。この TransactionManager は、Spring から接続したものとは異なるインスタンスです。(私たちの Bean は arjuna 環境 Bean からインスタンス化されていました)。Spring の JtaManager を使用して、デフォルトの場所で JNDI を介してコンテナーからトランザクション マネージャーを取得することで、Hibernate が使用する JTA プラットフォーム (この場合は JBoss App Server) で同じトランザクション マネージャーを使用できるようになりました。

この変更を行う前は、アプリケーション TransactionManager は Hibernate とのトランザクションにありましたが、データソースの transactionManager が参加していなかったため、「リーク」が発生していました。

同じインスタンスを使用すると、すべてが連携して機能します。これは、同じアプローチを使用して WebLogic でも証明されています。

于 2013-10-16T14:59:59.563 に答える