12

Web層では、特定のサーブレットのインスタンスが1つしか存在せず、複数のリクエストを処理する可能性があることは誰もが知っています。これにより、インスタンス変数でスレッドの問題が発生する可能性があります。

私の質問は、 @EJB アノテーションを使用してインスタンス変数としてサーブレットに EJB を注入しても安全ですか?

EJB の同じインスタンスが同時に複数の要求を処理するという仮定の下では、私の最初の本能は「いいえ」です。これは、他の多くのプログラマーの本能でもあるようです:サーブレットに注入しないでください

しかし、私は間違った結論に飛びつきました。明らかに、サーブレットに挿入されるのはプロキシです。コンテナは実際に各リクエストを異なるインスタンスで処理し、スレッド セーフを維持しますか? このフォーラムが示唆するように: Do inject to servlets

賛否両論あるようです。どちらが正しい???

4

4 に答える 4

11

EJBがステートレスである限り、サーブレットインスタンス変数としてサーブレットにEJBを挿入しても安全です。サーブレットにステートフルBeanを注入してはなりません。

EJBをステートレスに実装する必要があります。これは、EJB自体がステートフル値(永続コンテキストなど)を保持するインスタンス変数を保持しないためです。永続コンテキストを使用する必要がある場合は、EJBのメソッドでそのインスタンスを取得する必要があります。これを行うには、PersistenceContextFactoryをEJBインスタンス変数として使用し、EJBのメソッドでファクトリからエンティティマネージャのインスタンスを取得します。

PersistenceContextFactoryはスレッドセーフであるため、インスタンス変数に挿入できます。

上記のルールに準拠している限り、サーブレットにステートレスBeanを挿入することはスレッドセーフである必要があります。

于 2009-03-25T15:36:25.863 に答える
1

混合袋です。

ステートレス セッション Bean は注入される可能性があり、安全です。これは、スタブのインスタンスが 1 つ使用されている場合でも、メソッドへのアクセスがコンテナーによってシリアル化されるためです。

inferreddesign の言うことは真実ではないと思います。ステートレス セッション Bean が永続コンテキストを使用するかどうかは問題ではありません。1 つの Bean インスタンスに同時にアクセスできる呼び出し元は 1 つだけなので、永続コンテキストがスレッド セーフでなくても、EJB は複数のアクセスから保護します。すべてのセッション Bean メソッドに同期キーワードが適用されていると考えてください。

EJB をサーブレットに注入する際の主な問題は、パフォーマンスだと思います。単一のスタブ インスタンスは、セッション Bean メソッドが実行されるのを待っている間に複数の要求がキューに登録されている場合に、主要な競合領域になります。

于 2010-08-27T13:52:24.220 に答える