1. ホーム
  2. jakarta-ee

[解決済み] ステートレスセッションビーンよりステートフルセッションビーンを使うべきですか?

2023-05-21 19:58:24

質問

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

ステートフルセッションビーン オブジェクトの状態は,インスタンス変数の値から構成される。 で構成される。ステートフルセッションビーンでは,インスタンス変数 は,一意のクライアント-ビーンセッションの状態を表す。なぜなら クライアントはそのビーンと対話("会話")するので, この状態はしばしば会話状態と呼ばれる。 会話状態と呼ばれる。

状態なしセッションBeanは,次のように定義される。

ステートレスセッションビーン ステートレスセッションビーンは,クライアントとの会話状態を維持しない。 クライアントとの会話状態を維持しない。クライアントが メソッドを呼び出すとき,Beanのインスタンス変数は,そのクライアントに固有の状態を含むことができる。 そのクライアントに固有の状態を含むかもしれないが,それは呼び出されている間だけである。 ただし,呼び出す間だけとする。メソッドが終了したとき,クライアント固有の状態 は保持されるべきではない。しかし,クライアントは,プールされたステートレスBeanのインスタンス変数の状態を変更してもよい。 しかし,クライアントは,プールされたステートレスBeanのインスタンス変数の状態を変更することができ, この状態は,次のステートレスBeanの起動まで保持される。 この状態は,プールされたステートレスビーンの次の呼び出しまで保持される。ただし メソッド呼び出しの間以外は,ステートレスBeanのすべてのインスタンスは等価である。 EJBコンテナが,任意のクライアントにインスタンスを割り当てることを可能にする。 クライアントに割り当てることができる。すなわち,状態なしセッションBeanの状態は,すべてのクライアントにわたって適用されることが望ましい。 をすべてのクライアントに適用しなければならない。

ステートフルセッションビーンに対して,ステートレスセッションビーンを使用する利点は,次のとおりである。

ステートレスセッションビーンは複数のクライアントをサポートすることができるため 多数のクライアントを必要とするアプリケーションに対して,より良いスケーラビリティを提供することができる。 のクライアントを必要とするアプリケーションに対して、より良いスケーラビリティを提供することができます。一般に、アプリケーションは、同じ数のクライアントをサポートするために、ステートフルセッションビーンよりも少ないステートレスセッションビーンを必要とします。 ビーンは、同じ数のクライアントをサポートするために、ステートフル・セッション のクライアントをサポートするために必要なステートレスセッションビーンは,ステートフルセッションビーンよりも少ない。

そこで浮かんでくる疑問は、どのような場合にステートフルセッションビーンを使うべきなのか、ということです。私の素朴な理解では、できる限りステートレス セッション ビーンを使用することにこだわるべきだと思います。

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

セッションビーン

どのように解決するのですか?

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

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

一方 ステートフルセッションビーン はクライアントと密接に結びつきます。各インスタンスは1つのクライアントに作成され束縛され、その特定のクライアントからのリクエストにのみ対応します。そのため、ステートフルビーンに2つの後続のリクエストを行うと、リクエストは常にビーンの同じインスタンスから提供されることになります。つまり,要求の間で会話状態を維持することができる。ライフサイクルの終わりに,クライアントはremoveメソッドを呼び出し,Beanは破壊される/ガベージコレクションのために準備されている。

ステートレス、ステートフル、どちらをいつ使うか?

それは、主に、あなたが 会話状態 . 例えば、2つの数値を加算して結果を返すメソッドがある場合、1回限りの操作なのでステートレスBeanを使用します。このメソッドを他の数字で2回目に呼び出すと、前の足し算の結果にはもう興味がありません。

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