2011-12-13 9 views
3

EntityManagerFactoryのインスタンス化を保証するDBManagerシングルトンがあります。私はただ一つのトランザクションがEntityManagerに関連付けられているので、単一または複数のEntityManagerの使用について議論しています。OpenJPAトランザクション - 単一または複数のエンティティ管理者?

私は複数のトランザクションを使用する必要があります。 JPAはネストされたトランザクションをサポートしていません。

私の質問は次のとおりです。シングルデータベース環境でトランザクションを使用する通常のアプリケーションのほとんどでは、単一のEntityManagerを使用しますか?これまで私は複数のEntityManagerを使用していましたが、単一のものを作成することがトリックを行うことができるかどうか、また速度を上げることができるかどうかを確認したいと思います。

は、だから私は、以下役に立った:それはあまりにも他の誰かに役立ちます願っています。 http://en.wikibooks.org/wiki/Java_Persistence/Transactions#Nested_Transactions

は技術的にJPAのEntityManagerには、それが作成され 点からのトランザクションです。だから始まりはやや冗長です。開始までは と呼ばれ、永続化、マージ、削除などの特定の操作は と呼ばれることはできません。クエリはまだ行うことができ、これは、それがいずれかを行う前に開始呼び出すことが最善であるが、通常、彼らがコミットされますJPA仕様ではこれらの変化に 、 何が起こるかやや指定されていないものの、 を照会したオブジェクトは、変更することができますあなたの オブジェクトに変更されます。通常、それは永続 コンテキストに残っている古いオブジェクトを持って回避するために、ごみに以前に管理対象オブジェクトの収集を可能にするために、各 取引のための新しいEntityManagerを作成するのが最善です。

成功したが、EntityManagerを使用し続けることができるコミットした後、 および管理対象オブジェクトのすべてを管理残ります。しかし、ガベージコレクション を許可し、失効したデータを避けるためにEntityManagerを閉じるかクリアするのが最も一般的には です。コミットが失敗すると、管理対象オブジェクト はデタッチされたものとみなされ、EntityManagerはクリアされます。これは、失敗をコミットして再試行できない を意味します。失敗した場合は、トランザクション全体を再度実行する必要があります。 以前の 管理対象オブジェクトは、矛盾した状態のままでもかまいません。これは、オブジェクトをロックするバージョンの一部が増えた可能性があることを意味します。トランザクションがロールバックとしてマークされている場合は、 コミットも失敗します。これは、 がsetRollbackOnlyを呼び出して明示的に発生するか、またはクエリまたは検索操作が失敗した場合に に設定する必要があります。 クエリが失敗する可能性がありますが、 トランザクション全体をロールバックさせることは望ましくない場合があります。

ロールバック操作は、データベースのトランザクションをロールバックします。 永続コンテキストの管理オブジェクトがデタッチされて になり、EntityManagerがクリアされます。これは以前にオブジェクトが読み取られ、使用されなくなり、もはや永続コンテキスト の一部ではないことを意味します。オブジェクトに加えられた変更は のままになりますが、オブジェクトの変更は元に戻されません。

答えて

3

EntityManager s定義上、スレッドセーフではありません。したがって、アプリケーションがシングルスレッドの場合を除き、単一のEMを使用するのはおそらく方法ではありません。

+0

CLIベースのアプリケーションはシングルスレッドであり、あなたがThread.start()を呼び出さないとすれば、それは正しいでしょうか? – thirdy

+0

これは、アプリケーションがajaxで遅延ロードを使用する必要がある場合、遅延ロードされたエンティティに加えられた変更をマージする必要がある場合はどうすればよいでしょうか? –

関連する問題