0

サーブレットとサーブレットへのEJBの挿入に関して、以下のブログに出くわしました。著者は標準的な観点から書いています。

http://tamanmohamed.blogspot.ie/2012/03/jpa-why-we-need-to-specizes-type-level.html http://tamanmohamed.blogspot.ie/2012/03/jpa-thread-safety -when-injecting.html

「EJB3ステートフルBeanをサーブレットインスタンスフィールドに注入することはスレッドセーフではありません。同じように、@PersistenceContextを使用してEntityManagerをサーブレットインスタンス変数に注入することもスレッドセーフではありません。EntityManagerはスレッドセーフになるように設計されていません。」

とにかく、Glassfish-3.1.2の実装で同僚と書いているコードについて心配し始めています。下記参照。Dukeの個別指導チュートリアルで見たコードに似ていると思ったので、問題ないはずです(FaceServletsが@PersistnceContext EntityManagerを使用してステートレスリクエストBeanを呼び出す場合)。

ただし、コンテナ管理のEntityManagerは、サーブレットの多くのインスタンスによって呼び出されるステートレスBeanの多数の同時呼び出しに対処できると思います。

これは、Oracleデータベースを使用するGlassfish-3.1.2の正しい仮定ですか?これまでは問題なく動作しているようですが、高負荷では動作しない可能性があります。

洞察を事前に感謝します。申し訳ありませんが、私はこれにとても慣れていません。フィオナ

Servlet
{
@EJB
private StatelessbeanBlah
:
}

@Stateless
StatelessBeanBlah
{
@PersistenceContext(unitname = "...")
private EntityManager em;
4

1 に答える 1

1

Container-Managed Entity ManagersEntityManager インスタンスのスレッドセーフは、またはを使用しているかどうかに依存するため、質問には混乱がありますApplication-Managed Entity Managers。最初のケースでは、

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

...

永続化コンテキストを自動的に伝播することにより、アプリケーション コンポーネントは、単一のトランザクション内で変更を行うために、EntityManager インスタンスへの参照を相互に渡す必要がなくなります。Java EE コンテナは、コンテナ管理のエンティティ マネージャのライフサイクルを管理します。

(ref.エンティティの管理、 Java EE 6 チュートリアル)

persistence.xml ファイルで JTA 対応のデータ ソースを定義してみて、何が起こるかを確認してください。Java EE 6 Web アプリケーションを開発するときに JSF があり、ほとんどの状況で独自のサーブレットを作成する必要がないため、永続コンテキストをサーブレットに注入することに熱心ではありません。また、私はこのテクノロジにまったく慣れていません。 、 それも。ただし、JTA 対応のデータ ソースを使用してマネージド Bean またはエンタープライズ Bean (ステートレス EJB など) に永続化コンテキストを注入することは、まったく問題なく、スレッド セーフです。

于 2012-07-04T12:41:46.080 に答える