「jta-datasource」と「resource-local」データソースの違いは何ですか? 質問する

「jta-datasource」と「resource-local」データソースの違いは何ですか? 質問する

「jta-datasource」と「resource-local datasource」という用語は、私にとっては少し曖昧です。私が理解している(または想定している)ことを記載していますが、どこが正しいか、どこが間違っているかを教えてください。

  • 同じデータベースは、jtaデータソースまたはリソースローカルデータソースと呼ばれることもあります。
  • jta-datasourceとして記述されている場合、Beanや他のクラスはJTAを使用できます。したがって、UserTransactionインターフェース
  • 使えないCMTM/BMTデータソースがリソースローカルの場合
  • リソース ローカル データソースとして指定されている場合、トランザクションは JTA に対応していません。コードは EntityTransaction インターフェイスを使用できますが、UserTransaction インターフェイスは使用できません。

ありがとう!

ベストアンサー1

「jta-datasource」と「resouce-local datasource」という用語は私にとって少し曖昧です。

jta-datasource実際には と要素を参照していると思いますnon-jta-datasource。簡単に言うと、

  • 永続ユニットのトランザクションタイプがJTA要素は、jta-datasource接続を取得するために使用される JTA データ ソースの JNDI 名を宣言するために使用されます。これは一般的なケースです。
  • 永続ユニットのトランザクションタイプがリソースローカルnon-jta-data-source非 JTA データ ソースの JNDI 名を宣言するには を使用する必要があります。
  • 同じデータベースは、jtaデータソースまたはリソースローカルデータソースと呼ばれることもあります。

これは正解です。そして、上では触れませんでしたが、プロバイダーによっては、jta-datasource そしてa をnon-jta-datasource使用し、後者を JTA 以外の接続 (つまり、進行中の JTA トランザクションに関連付けられていない接続) を介した最適化された読み取りに使用します。

  • jta-datasource として記述されている場合、Bean または他のクラスは JTA を使用できます。したがって、UserTransaction インターフェイスです。

最初の部分は正しいが、最後の部分は完全には正しくない。EJB 3.0仕様のセクション13.3.4 コンテナ管理トランザクション境界を使用するエンタープライズ Bean:

エンタープライズ Bean のビジネス メソッドは [...]javax.transaction.UserTransactionインターフェースを取得または使用しようとしてはなりません。

そしてセクション16.12 ユーザートランザクションインターフェース:

コンテナは、UserTransactionこのインターフェースの使用が許可されていないエンタープライズ Bean に対してインターフェースを使用可能にしてはなりません。

つまり、このUserTransactionインターフェースは CMT エンタープライズ Bean では使用できません。

  • データソースがリソースローカルの場合、CMT / BMT は使用できません

文言が少しわかりにくいですが、厳密には正しくないと思います。JPA 1.0仕様のセクション§ 5.5 取引の管理:

アプリケーション管理エンティティ マネージャは、JTA エンティティ マネージャまたはリソース ローカル エンティティ マネージャのいずれかになります。

...

Java EE Web コンテナと EJB コンテナでは、JTA エンティティ マネージャとリソース ローカル エンティティ マネージャの両方をサポートする必要があります。EJB 環境では、通常、JTA エンティティ マネージャが使用されます。

そしてセクション6.2.1.2 トランザクションタイプ

属性transaction-typeは、永続性ユニットのエンティティ マネージャ ファクトリによって提供されるエンティティ マネージャが JTA エンティティ マネージャであるか、リソース ローカル エンティティ マネージャであるかを指定するために使用されます。この要素の値はJTAまたは ですRESOURCE_LOCAL。JTA のトランザクション タイプは、要素によって指定されるかjta-data-source、またはコンテナによって提供される JTA データ ソースが提供されることを前提としています。一般に、Java EE 環境では、 はtransaction-typeRESOURCE_LOCALJTA データ ソースが提供されることを前提としています。Java EE 環境では、この要素が指定されていない場合、デフォルトは JTA です。

だから、アプリケーション管理エンティティマネージャこれはリソースローカルエンティティマネージャEntityManagerFactoryその場合、EMを取得するには を注入する必要があります)そしてそれはJTAトランザクションの一部にはなりません。この(非常に興味深い)議論

  • リソース ローカル データソースとして指定されている場合、トランザクションは JTA に対応していません。コードは EntityTransaction インターフェイスを使用できますが、UserTransaction インターフェイスは使用できません。

繰り返しになりますが、言葉遣いは少しわかりにくいですが、これは正しいと思います。

おすすめ記事