25

複数のスレッドがある場合、それぞれがインジェクターを使用してEntityManagerオブジェクトを取得し、それぞれがemオブジェクトを使用して他のクラスオブジェクトのリストを選択します。forループで使用する準備ができました。

スレッドが最初に終了してclear()を呼び出す場合、それは他のスレッドに影響しますか?forループのように例外がありますか?

close()はどうですか?

答えが「依存する」の場合、どのように依存しているかを調べるために、何(クラス定義?メソッド呼び出し?)とどこ(javaコード?アノテーション?xml?)を調べる必要がありますか?

私はソースを書きませんでした。ドキュメントなしで他の誰かのライブラリを使用しているだけです。

ありがとうございました。

4

5 に答える 5

14

エンティティーマネージャーはスレッドセーフではなく (ソースJava EE 6 チュートリアル)、スレッド間で共有できません。各スレッドは独自のエンティティ マネージャーを使用する必要があります。そうしないと、clear()またはclose()呼び出しに関係なく、問題が発生します。

ただし、インジェクターが各スレッドに独自のエンティティ マネージャーを挿入している場合は問題ありません。

Spring およびおそらく他の DI フレームワークは、実際のエンティティ マネージャーの ThreadLocal ベースのプロキシを Bean に注入します。各スレッドが行う呼び出しは、エンティティ マネージャの実際のスレッド ローカル インスタンスにプロキシされます。エンティティ マネージャが複数のスレッド間で共有されているように見える場合でも、これが機能する方法です。

エンティティマネージャーがどのように注入されるかについての詳細が役立ちます (Spring など)。

于 2013-02-15T04:22:51.207 に答える
4

EntityManager の管理には、コンテナ管理とアプリケーション管理の 2 種類があります。アプリケーション管理の場合、EntityManager を取得するための推奨される方法は、EntityManagerFactory を使用することです。Java EE チュートリアルには次のように書かれています。

コンテナ管理のエンティティ マネージャ

コンテナ管理のエンティティ マネージャを使用すると、EntityManager インスタンスの永続化コンテキストがコンテナによって、単一の Java Transaction API (JTA) トランザクション内で EntityManager インスタンスを使用するすべてのアプリケーション コンポーネントに自動的に伝播されます。

通常、JTA トランザクションには、アプリケーション コンポーネント間の呼び出しが含まれます。JTA トランザクションを完了するために、これらのコンポーネントは通常、単一の永続化コンテキストにアクセスする必要があります。これは、javax.persistence.PersistenceContext アノテーションを使用して EntityManager がアプリケーション コンポーネントに注入されたときに発生します。永続コンテキストは現在の JTA トランザクションで自動的に伝播され、同じ永続ユニットにマップされた EntityManager 参照は、そのトランザクション内の永続コンテキストへのアクセスを提供します。永続化コンテキストを自動的に伝播することにより、アプリケーション コンポーネントは、単一のトランザクション内で変更を行うために、EntityManager インスタンスへの参照を相互に渡す必要がなくなります。Java EE コンテナは、コンテナ管理のエンティティ マネージャのライフサイクルを管理します。

EntityManager インスタンスを取得するには、エンティティ マネージャーをアプリケーション コンポーネントに挿入します。

@PersistenceContext 
EntityManager em; 

アプリケーション管理エンティティ マネージャ

一方、アプリケーション管理のエンティティ マネージャーでは、永続化コンテキストはアプリケーション コンポーネントに伝播されず、EntityManager インスタンスのライフサイクルはアプリケーションによって管理されます。

アプリケーション管理エンティティ マネージャは、特定の永続性ユニット内の EntityManager インスタンス間で JTA トランザクションによって伝播されない永続性コンテキストにアプリケーションがアクセスする必要がある場合に使用されます。この場合、各 EntityManager は新しい分離された永続化コンテキストを作成します。EntityManager とそれに関連付けられた永続コンテキストは、アプリケーションによって明示的に作成および破棄されます。また、EntityManager インスタンスはスレッドセーフではないため、EntityManager インスタンスを直接注入できない場合にも使用されます。EntityManagerFactory インスタンスはスレッドセーフです。

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html

于 2013-02-15T04:20:30.947 に答える
1

通常、データベースオブジェクトで行うことに関するトランザクションがあります。与えられた各スレッドが他のスレッドによって行われた変更について見るものは、「トランザクション分離」設定によって制御されます。

さまざまな分離設定について学び始め、必要に応じて適切な設定を適用します。精度と速度の間にはトレードオフがあります。 http://en.wikipedia.org/wiki/Isolation_%28database_systems%29

于 2013-02-15T05:26:44.573 に答える