97

以下のような質問があります。

  1. これら2つの違いは何ですか?
  2. これらは両方ともすべてのデータベースでサポートされていますか?
  3. JPA TransactionManager と JTA TransactionManager は異なりますか?
4

4 に答える 4

104

JPA実装では、トランザクション自体を管理するRESOURCE_LOCALか()、アプリケーションサーバーのJTA実装でトランザクションを管理するかを選択できます。

ほとんどの場合、RESOURCE_LOCALで問題ありません。これは、基本的なJDBCレベルのトランザクションを使用します。欠点は、トランザクションがJPA永続性ユニットに対してローカルであるため、複数の永続性ユニット(または他のデータベース)にまたがるトランザクションが必要な場合、RESOURCE_LOCALでは不十分な場合があります。

JTAは、JMSやJCAなどのシステム間でトランザクションを管理するためにも使用されますが、それは私たちのほとんどにとってかなりエキゾチックな使用法です。

JTAを使用するには、アプリケーションサーバーでのJTAのサポートと、JDBCドライバーからのサポートが必要です。

于 2009-12-26T09:47:52.637 に答える
94

他の回答への追加として

これは、非常に役立つ記事 ( Apache TomEE Web サイトで公開) からの抜粋です。これは、OP の最初の質問への回答にも役立ちます (記事へのリンクは以下にあります)。


RESOURCE_LOCAL と JTA 永続コンテキストの比較


<persistence-unit transaction-type="RESOURCE_LOCAL"> を使用すると、 EntityManager (PersistenceContext/Cache) の作成と追跡を担当します...

  • EntityManagerFactory を使用して EntityManagerを取得する必要があります
  • 結果のEntityManagerインスタンス PersistenceContext/Cacheです
  • EntityManagerFactoryは、@PersistenceUnitアノテーションのみを介して注入できます ( @PersistenceContextではありません)。
  • @PersistenceContext を使用してタイプ RESOURCE_LOCAL のユニットを参照することは許可されていません
  • EntityTransaction API を 使用 して、EntityManger へのすべての呼び出しを開始/コミットする必要があります
  • entityManagerFactory.createEntityManager() を 2 回呼び出す と、 2 つの別個の EntityManager インスタンスが生成され、したがって 2 つの別個の PersistenceContexts/Cache が生成されます。
  • EntityManager の複数の インスタンスを使用することは、ほとんど良い考えではありません (最初のインスタンスを破棄しない限り、2 つ目のインスタンスを作成しないでください)。


<persistence-unit transaction-type="JTA">を使用すると、 CONTAINERは EntityManager (PersistenceContext/Cache) の作成と追跡を行います...

  • EntityManagerFactory を使用して EntityManagerを取得することはできません
  • コンテナによって提供される EntityManagerのみを取得できます
  • EntityManagerは@PersistenceContext アノテーションのみ を介して注入できます( @PersistenceUnit ではありません)。
  • @PersistenceUnit を使用してタイプ JTA のユニットを参照することは 許可されていません
  • コンテナーによって提供される EntityManager は、JTAトランザクションに関連付けられた PersistenceContext/Cache への参照です。
  • JTA トランザクションが進行中でない場合 、PersistenceContext/Cache がないため、EntityManagerを使用できません。
  • 同じトランザクション内の同じユニットへの EntityManager 参照を持つすべての人は、同じ PersistenceContext/Cacheへの参照を自動的に持ちます。
  • PersistenceContext/Cache は、JTAコミット時にフラッシュおよびクリアされます

Java Persistence API の学習に関心のある方は、ぜひJPA の概念: JPA 101の記事全文をお読みください。

于 2015-03-11T21:52:58.440 に答える
19

Resource_Local と JTA はトランザクション マネージャー (トランザクションを実行する方法) です。これはデータベースのプロパティではなく、トランザクションの調整を担当するコンポーネントです。JPA と JTA のトランザクション マネージャーは異なります。JPA トランザクション マネージャーは JPA トランザクションを担当します。JPA トランザクションのみを行う場合は、JPA トランザクション マネージャーを使用します。JTA トランザクション マネージャーは汎用トランザクション マネージャーであり、JMS キューなどの他のリソースをトランザクションに参加させることができます。通常、Java EE コンテナは、EJB、JPA エンティティなどに JTA トランザクション マネージャを使用します。

于 2009-12-26T03:17:49.860 に答える