Stateful Session Beanの場合、クライアントの初期アクセスからRemove要求まで同一インスタンスを使用し、クライアントとの対話状態を保持するため、他Enterprise Beanに比べてメモリ使用量が多くなります。メモリ使用量を制御するため、要求実行中ではないBeanインスタンスをキャッシュする時間や数を調整することができます。
Stateful Session Beanインスタンスのライフサイクルは、EJBの規約に説明されています。EJBコンテナは、メソッド実行可状態のBeanインスタンスをキャッシュに格納します。クライアントからBeanのビジネスメソッドに対して再度要求がくると、Beanインスタンスをキャッシュから取得し、メソッドを実行して、実行完了後にインスタンスをキャッシュに戻します。同じBeanに対して再度要求がくると、該当のBeanインスタンスをキャッシュから取得し、メソッド実行完了後にキャッシュに戻します。
クライアントからBeanに対してRemove要求が発行されるとBeanインスタンスがキャッシュから削除され、インスタンスが破棄されます。
キャッシュの設定
以下の表にキャッシング機能を制御するチューニング項目を説明します。
チューニング項目 | 効果 |
---|---|
最大キャッシュサイズ | 同時にアクセスするクライアント数に設定することにより、メモリの使用量を削減できます。 |
キャッシュのサイズ変更量 | 要求のピークが終わって不要になったインスタンスを素早く破棄することによりメモリ消費を低減できます。 |
キャッシュアイドルタイムアウト | クライアントがBeanに対してRemove要求を発行し忘れている場合に、不要なBeanインスタンスが自動的に消去されるため、不要なメモリの増加を防ぐことができます。 |
削除タイムアウト | 長時間使用されていない不要なBeanインスタンスが消去されるため、資源の最適化ができます。 |
選択内容の削除ポリシー | 頻繁に使用されるBeanインスタンスのpassivateとactivate処理による性能劣化を縮小できます。 |
EJBコンテナがpassivateするインスタンスの保存場所は以下のチューニング項目で変更できます。
チューニング項目 | 効果 |
---|---|
セッション格納位置 | 例えば容量にゆとりがある任意のディスクドライブを指定して資源配置の最適化を図ったり、ファイルI/Oが速い任意のディスクドライブを指定することによりファイル化したBeanインスタンスの操作速度を向上させることができます。 |
デフォルトの格納場所とそのディレクトリ配下の構成については、「付録B ファイル構成」を参照してください。ファイルはpassivateしたBeanインスタンスごとに作成され、Beanのactivate、削除タイムアウト、またはIJServerクラスタの削除時に削除されます。セッション格納位置のディスク容量の見積もり方法については、「6.15.1 運用時に必要なディスク容量」を参照してください。
キャッシュのチューニング設定はEnterprise Beanごとに指定できます。定義詳細については、以下を参照してください。
「3.2.1.3 Interstage EJB application deployment descriptor (glassfish-ejb-jar.xml)」の<ejb><bean-cache>タグ
Enterprise Beanのキャッシュ設定を指定しない場合は、IJServerクラスタの値が使用されます。この値は、asadminコマンドを使用して変更できます。詳細については、以下を参照してください。
注意
IJServerクラスタ停止状態でStateful Session Beanを配備解除した場合、「セッション格納位置」配下の資産は削除されません。このときはアプリケーション配備解除後にユーザーが資産を削除してください。
IJServerクラスタ起動状態でStateful Session Beanを配備解除した場合、「セッション格納位置」配下の資産は削除されます。IJServerクラスタ起動状態では「セッション格納位置」配下の資産の削除をユーザーは行わないでください。
passivateする時には、Beanインスタンスを直列化してファイルシステムに格納します。このため、Beanインスタンスから参照するオブジェクトが直列化できる(java.io.Serializableインタフェースを実装するなど)必要があります。Beanインスタンスが直列化できない場合には、java.io.NotSerializableException例外が発生してpassivateに失敗し、そのBeanインスタンスは削除されます
EJBコンテナは、IJServerクラスタの停止時にキャッシュしている全Beanインスタンスをpassivateします。ただし、IJServerクラスタを強制停止した場合は、EJBコンテナはpassivateせずに終了します。