RESOURCE_LOCALまたはJTAとしての永続性ユニット?


87

私は以下のような質問があります:

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

回答:


101

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

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

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

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


3
glassfihではresource_localを使用できないようです-どうすればよいですか?
pete_ch 2012

3
補足として、Atomikos などのサードパーティソリューションを使用することで、完全なJava EEアプリケーションサーバーがなくても、JTA機能を利用できます。したがって、Tomcatのような軽量のWebコンテナを使用しても、JTAサポートを利用できます。
informatik01

84

他の答えへの追加として

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


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


<persistence-単位のトランザクション・タイプ= "RESOURCE_LOCAL"> YOUは、 EntityManagerの(のPersistenceContext /キャッシュ)を作成し、追跡を担当しています...

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


<persistence-単位のトランザクション・タイプ= "JTA">コンテナは、 EntityManagerの(のPersistenceContext /キャッシュ)を作成し、追跡を行います...

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

Java Persistence APIの学習に興味のある方は、ぜひ、JPAの概念:JPA101の記事全体をお読みください。


8
1つのポイントを追加したかっただけです。Springを使用している場合は、@ PersistenceContextとEntityManagerをResource_Localとともに使用できます。この場合、Springコンテナは@Transactionalアノテーションを使用してトランザクションを管理できます。
サム

私のプロジェクトでtransaction-type=RESOURCE_LOCAL@PersistenceContext@Transactional春によって管理
ラヴィParekhの

あなたが提供したリンクのために、私は上向きの三角形を打っています。
Koray Tugay 2017年

@KorayTugay申し訳ありませんが、あなたの言うこと、どの三角形がよくわかりませんでしたか?
informatik01

1
@LinuRaduこの回答はあなたに役立つかもしれません:Hibernateでのsession.flush()の使用は何ですか
informatik01

18

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


1

resource_localとJTAのローカルトランザクションとグローバルトランザクションについて。1つのトランザクションで複数のリソースを管理できるかどうかについてです。

CMTとBMTは、誰がトランザクションを開始および終了するかについてです-アプリケーション開発者またはアプリケーションサーバー。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.