Cosminexus V9 アプリケーションサーバ 機能解説 互換編

[目次][用語][索引][前へ][次へ]

6.4.2 グローバルセッション情報

メモリセッションフェイルオーバ機能を使用する場合,グローバルセッション情報はSFOサーバで管理されます。

SFOサーバでグローバルセッション情報として保持するセッション情報には,次の設定ができます。

これらの設定は,セッションフェイルオーバ用フィルタに設定します。設定については,「6.12 DDでの定義」を参照してください。

次に,各設定内容について説明します。

<この項の構成>
(1) グローバルセッション情報として引き継ぐセッション情報の範囲
(2) グローバルセッション情報として指定できるセッション情報のデータ型
(3) 引き継ぎ対象外のオブジェクトの扱い
(4) グローバルセッション情報の種別
(5) SFOサーバでのグローバルセッション情報の管理方法

(1) グローバルセッション情報として引き継ぐセッション情報の範囲

SFOサーバでは,引き継ぎ対象として選択したセッション情報だけがグローバルセッション情報として保持されます。グローバルセッション情報として選択できるセッション情報は,HTTPセッションに登録された一部,またはすべてです。引き継ぎ対象として選択するセッション情報は,グローバルセッション情報の種別ごとに指定できます。グローバルセッション情報の種別については,「(4) グローバルセッション情報の種別」を参照してください。

グローバルセッション情報選択時の注意事項
パフォーマンス向上のために,グローバルセッション情報には,必要最低限のHTTPセッション情報を指定してください。
(a) HTTPセッションに登録された一部のセッション情報を引き継ぐ場合

HTTPセッションに登録されたセッション情報のうち,一部のセッション情報をグローバルセッション情報として引き継ぐ場合には,あらかじめ,DD(web.xml)で引き継ぎ対象とするセッション情報のキー名称を指定する必要があります。この場合,Webアプリケーション内で動的にキー名称を作成するセッション情報をグローバルセッションとして指定することはできません。

HTTPセッションに登録された一部のセッション情報を引き継ぐ例を次の図に示します。

図6-5 HTTPセッションに登録された一部のセッション情報を引き継ぐ例

[図データ]

(b) HTTPセッションに登録されたすべてのセッション情報を引き継ぐ場合

HTTPセッションに登録されたセッション情報を,グローバルセッション情報としてすべて引き継ぐ場合には,あらかじめ,DD(web.xml)で引き継ぎ対象とするセッション情報のキー名称を設定する必要はありません。ただし,すべてのセッション情報を引き継ぐ設定をする必要があります。

注意
HTTPセッションに登録されたすべてのセッション情報をグローバルセッション情報として引き継ぐと,引き継ぐ必要がない情報がHTTPセッションに登録されている場合に,リクエスト処理のパフォーマンスが低下することがあります。このため,グローバルセッション情報には,必要なHTTPセッション情報だけ指定して引き継ぐことをお勧めします。

(2) グローバルセッション情報として指定できるセッション情報のデータ型

(a) データ型の種類

グローバルセッション情報として指定できるセッション情報には,次のデータ型のオブジェクトが指定できます。

java.lang.Stringクラス以外のデータ型のオブジェクトを引き継ぎ対象とする場合は,あらかじめ,DD(web.xml)でデータ型の引き継ぎを許可する設定が必要です。DD(web.xml)でデータ型の設定を省略した場合は,java.lang.Stringクラスのオブジェクトだけが引き継ぎ可能なセッション情報となります。

参考
既存のJ2EEアプリケーションにメモリセッションフェイルオーバ機能を適用するときは,引き継ぎをしたいセッション情報のデータ型を確認してください。指定したデータ型以外のオブジェクトの扱いについては,「(3) 引き継ぎ対象外のオブジェクトの扱い」を参照してください。
(b) 直列化可能クラスのオブジェクトを引き継ぎ対象にする場合の注意事項
(c) データ型選択時の注意事項

セッション情報が直列化可能クラスのオブジェクトである場合,グローバルセッション情報の更新,および引き継ぎ処理で,オブジェクトのシリアライズまたはデシリアライズ処理が必要になります。シリアライズ処理は,引き継ぎ対象のオブジェクトだけでなく,このオブジェクトから参照されるオブジェクトすべてを対象とします。このため,引き継ぐ必要がない情報を含むクラスの場合,性能が低下することがあります。

シリアライズ処理の対象範囲の例を次の図に示します。

図6-6 シリアライズ処理の対象範囲の例

[図データ]

この図では,HTTPセッションに登録されたオブジェクト(1〜3)にフィールドとして含まれているオブジェクト(a〜e)も,シリアライズ処理の対象に含まれます。

パフォーマンス向上のためには,グローバルセッション情報をjava.lang.Stringクラスまたはbyte型配列のオブジェクトに限定することをお勧めします。

(3) 引き継ぎ対象外のオブジェクトの扱い

グローバルセッション情報として引き継ぎ対象外となるオブジェクトがHTTPセッションに登録された場合の扱いについて説明します。引き継ぎ対象とするセッション情報のデータ型および範囲の設定によって,オブジェクトの扱いが異なります。

また,直列化可能クラスのオブジェクトの場合,セッション情報の引き継ぎ時にシリアライズ処理またはデシリアライズ処理を実施します。これらの処理に成功するかどうかによってもオブジェクトの扱いが異なります。

(a) java.lang.Stringクラスまたはbyte型配列のオブジェクトが引き継ぎ対象である場合

リクエスト処理完了時点で,HTTPセッションにjava.lang.Stringクラスまたはbyte型配列以外のオブジェクトが登録されている場合,引き継ぎ対象とするセッション情報の範囲の設定によって,セッション情報を引き継ぐかどうかが異なります。HTTPセッションに引き継ぎ対象外のオブジェクトが登録されている場合のセッション情報の引き継ぎ可否を次の表に示します。

表6-5 HTTPセッションに引き継ぎ対象以外のオブジェクトが登録されている場合のセッション情報の引き継ぎ可否

引き継ぎ対象とするセッション情報の範囲 リクエスト処理完了時点の動作 セッション情報の引き継ぎ可否
引き継ぎ対象外のオブジェクト 引き継ぎ対象のオブジェクト
一部のセッション情報を引き継ぐ場合 KDJE34226-Eのメッセージが出力され,エラーが通知されます。
HTTPセッションに登録されたすべての書き換え可能グローバルセッション情報は削除され,リクエストが処理されます。この場合,KDJE34219-WのメッセージがWarningレベルで出力されます。
セッション情報は引き継がれません。 エラーが通知される原因となったHTTPセッションに登録された,すべてのセッション情報が引き継がれません。
すべてのセッション情報を引き継ぐ場合 KDJE34255-WのメッセージがWarningレベルで出力されます。 セッション情報は引き継がれません。 セッション情報はSFOサーバに冗長化されて,引き継がれます。

注※ DD(web.xml)で指定したキーで登録されたセッション情報です。


(b) 直列化可能クラスのオブジェクトが引き継ぎ対象である場合

リクエスト処理完了時点で,HTTPセッションに引き継ぎ対象外のオブジェクト登録されている場合,引き継ぎ対象とするセッション情報の設定範囲によって,セッション情報を引き継ぐかどうかが異なります。

また,直列化可能クラスのオブジェクトの場合,セッション情報の引き継ぎ時にシリアライズ処理またはデシリアライズ処理を実施します。これらの処理に成功するかどうかによってもオブジェクトの扱いが異なります。

シリアライズおよびデシリアライズに失敗する原因
シリアライズおよびデシリアライズに失敗する原因について,次に示します。
シリアライズに失敗する原因
java.io.Serializableインタフェースを実装したクラスのオブジェクトがシリアライズに失敗する原因として,次の2点が考えられます。
  • HTTPセッションに登録された直列化可能クラスのオブジェクトから参照されたオブジェクトが,直列化可能クラス以外のクラスであった。
  • writeObject(java.io.ObjectOutputStream out)メソッドが実装されていて,かつwriteObject(java.io.ObjectOutputStream out)メソッドでシリアライズ時に例外が発生した。
デシリアライズに失敗する原因
java.io.Serializableインタフェースを実装したクラスのオブジェクトがデシリアライズに失敗する原因として,次の2点が考えられます。
  • アプリケーションが,シリアライズ処理時とデシリアライズ処理時で異なっていて,デシリアライズ処理が失敗する原因となる変更がアプリケーションに加えられている。
  • readObject(java.io.ObjectOutputStream in)メソッドが実装されていて,かつreadObject(java.io.ObjectOutputStream in)メソッドでデシリアライズ時に例外が発生した。

(4) グローバルセッション情報の種別

保持するセッション情報には,グローバルセッション情報の種別を設定します。グローバルセッション情報の種別には,次の2種類があります。

(5) SFOサーバでのグローバルセッション情報の管理方法

SFOサーバでは,HttpSessionオブジェクトに含まれるグローバルセッション情報は連結されて管理されます。直列化可能クラスのオブジェクトが引き継ぎ対象でない場合,セッション情報の連結には,区切り文字として半角セミコロン(;)が使用されます。直列化可能クラスのオブジェクトが引き継ぎ対象である場合は,連結するセッション情報がシリアライズ後の情報であるため,セッション情報の連結に区切り文字は使用されません。

なお,連結されたグローバルセッション情報のサイズには上限があります。上限を超えると,エラーになります。また,上限を超えたサイズのグローバルセッション情報は,SFOサーバでは管理されないので注意してください。グローバルセッション情報の最大サイズは,WebアプリケーションのDD(web.xml)で指定します。メモリセッションフェイルオーバ機能を使用する場合に必要な定義については,「6.12.1 DDの作成」を参照してください。また,開発環境でグローバルセッション情報のサイズを見積もる場合には,グローバルセッション情報のサイズ見積もり機能が使用できます。グローバルセッション情報のサイズ見積もり機能については,「6.5 グローバルセッション情報のサイズの見積もり」を参照してください。

また,デプロイ後のWebアプリケーションの場合,Webアプリケーションを含むJ2EEアプリケーションの属性(プロパティ)として設定できます。デプロイ後のWebアプリケーションのセッションフェイルオーバ用フィルタの設定については,「6.12 DDでの定義」を参照してください。