web-dev-qa-db-ja.com

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

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

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

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

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

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

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

頭に浮かぶ疑問は、いつステートフルセッションBeanを使用すべきかということです。この問題を単純に理解するには、できる限りステートレスセッションBeanを使用する必要があります。

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

セッションBean

77
sheidaei

最初に、サーバー上でBeanが作成および処理される方法を理解する必要があります。

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

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

ステートレスまたはステートフルを使用する場合

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

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

138
tobiasdenzler

を使用する最大の例は ステートフルセッションBean のためです ショッピングカート、ユーザーが購入したいすべての製品を保存します。

42
BSeitkazin