ステートレスセッションBeanよりもステートフルセッションBeanを使用する場合


83

ステートフルセッションBeanは次のように定義されます。

ステートフルセッションBeanオブジェクトの状態は、そのインスタンス変数の値で構成されます。ステートフルセッションBeanでは、インスタンス変数は一意のクライアントBeanセッションの状態を表します。クライアントはそのBeanと対話(「トーク」)するため、この状態はしばしば会話状態と呼ばれます。

ステートレスセッションBeanは次のように定義されます。

ステートレスセッションBeanステートレスセッションBeanは、クライアントとの会話状態を維持しません。クライアントがステートレスBeanのメソッドを呼び出す場合、Beanのインスタンス変数には、そのクライアントに固有の状態が含まれる場合がありますが、呼び出しの期間中のみです。メソッドが終了したとき、クライアント固有の状態は保持されるべきではありません。ただし、クライアントはプールされたステートレスBeanのインスタンス変数の状態を変更でき、この状態はプールされたステートレスBeanの次の呼び出しに保持されます。メソッド呼び出し中を除いて、ステートレスBeanのすべてのインスタンスは同等であり、EJBコンテナがインスタンスを任意のクライアントに割り当てることができます。つまり、ステートレスセッションBeanの状態は、すべてのクライアントに適用される必要があります。

ステートフルセッションBeanよりもステートレスセッションBeanを使用する利点は次のとおりです。

ステートレスセッションBeanは複数のクライアントをサポートできるため、多数のクライアントを必要とするアプリケーションのスケーラビリティを向上させることができます。通常、アプリケーションは、同じ数のクライアントをサポートするために、ステートフルセッションBeanよりも少ないステートレスセッションBeanを必要とします。

では、頭に浮かぶ質問は、ステートフルセッションBeanをいつ使用すべきかということです。この問題についての私の素朴な理解には、ステートレスセッションBeanをできるだけ使用することに固執する必要があります。

ステートフルセッションBeanを使用する候補は何でしょうか。良い例はありますか?

セッションビーン


回答:


151

まず、Beanがサーバー上でどのように作成および処理されるかを理解する必要があります。

以下のためにステートレスセッションBeanサーバーは、プール内のインスタンスの可変量を維持することができます。クライアントがそのようなステートレスBeanを(たとえばメソッドを介して)要求するたびに、その要求を処理するためにランダムなインスタンスが選択されます。つまり、クライアントが2つの後続の要求を実行すると、ステートレスBeanの2つの異なるインスタンスが要求を処理する可能性があります。実際、2つの要求の間に会話状態はありません。また、クライアントが消えても、ステートレスBeanは破棄されず、別のクライアントからの次のリクエストを処理できます。

一方、ステートフルセッションBeanはクライアントと密接に関連しています。各インスタンスは作成され、単一のクライアントにバインドされ、その特定のクライアントからの要求のみを処理します。したがって、ステートフルBeanで2つの後続のリクエストを実行すると、リクエストは常にBeanの同じインスタンスから処理されます。つまり、リクエスト間で会話状態を維持できます。ライフサイクルの終わりに、クライアントはremoveメソッドを呼び出し、Beanは破棄されるか、ガベージコレクションの準備が整います。

ステートレスまたはステートフルをいつ使用するか?

これは主に、会話状態を維持するかどうかによって異なります。たとえば、2つの数値を合計して結果を返すメソッドがある場合、これは1回限りの操作であるため、ステートレスBeanを使用します。このメソッドを他の番号でもう一度呼び出すと、前の追加の結果に関心がなくなります。

ただし、たとえば、クライアントが実行したリクエストの数をカウントする場合は、ステートフルBeanを使用する必要があります。このシナリオでは、クライアントが以前にBeanメソッドを要求した頻度を知ることが重要であるため、Bean内で会話状態を維持する必要があります(変数を使用するなど)。ここでステートレスBeanを使用する場合、クライアントの要求は毎回異なるBeanから処理されるため、結果が台無しになります。


16
クライアントが消えると、Beanも破壊されます」。実際、ステートフルセッションBeanは、@Removejavax.ejb)で装飾されたメソッドが明示的に呼び出されない限り、自動的に破棄されません(そのメソッドはコーディングする必要さえありません。アノテーションが付けられている場合は、単に空/空白のままにすることができます@Remove)。関連するクライアントがステートフルセッションBeanを破棄するのを忘れた場合、そのBeanは、コンテナ自体が独自のポリシーを使用して削除することを決定するまで、サーバー上でぶら下がっています。私は間違っていますか?
小さな2014

3
もちろん、あなたは正しいです。Beanのライフサイクルの詳細については、次を参照してください。docs.oracle.com
6

48

私が使用しての最大の例だと思うステートフルセッションBeanが用でショッピングカートユーザーが購入することを望んでいるすべての製品を保管し、。

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