第14章
この章では、exteNd Directorアプリケーションでデータのキャッシュを扱う方法について説明します。この章は、次の節から構成されています。
データのキャッシュによって、一時的に保存されたアプリケーションデータを管理できます。 データのキャッシュを管理する一般的な目的は、次のとおりです。
exteNd Directorは、HTTP要求、アプリケーションセッション、ポートレットアプリケーション、およびサーバライフタイム(サーバクラスタの場合)などの、さまざまなレベルでデータのキャッシュをサポートします。
EbiCacheManagerインターフェースでは、セッションレベルおよびサーバライフタイムのデータを管理できます。 次の2つのキャッシュメカニズムが利用できます。
オブジェクトキャッシュコンテナによって、コンテンツのサイズにかかわらず、メモリ内のすべてのオブジェクトが保存されます。 オブジェクトキャッシュコンテナは、putObjectInCache()メソッドがキャッシュホルダオブジェクトから呼び出されたときに称されます(次の節、キャッシュホルダについてを参照)。 オブジェクトキャッシュでは、キャッシュされたオブジェクトをシリアル化する必要はありません。
キャッシュされたコンテンツのサイズが大きな問題とならない場合やシリアル化されていないオブジェクトの保存機能が必要な場合、あるいはその両方の場合に、オブジェクトキャッシュコンテナを使用します。
動作 オブジェクトキャッシュコンテナは、キャッシュ設定で指定された最大数のオブジェクトを使用して、使用頻度の最も低いオブジェクトをキャッシュから削除する時期を決定します。 オブジェクトが最大数に達していなくてもメモリが不足している場合は、オブジェクトキャッシュコンテナによって、使用頻度の最も低いオブジェクトがキャッシュから削除されます。
メモリキャッシュおよびディスクキャッシュコンテナのメカニズムによって、オブジェクトはそのサイズに応じてメモリまたはディスク上に保存されます。 このキャッシュメカニズムでは、キャッシュされたオブジェクトがシリアル化されていることが必要です。 putValueInCache()メソッドがキャッシュホルダオブジェクトから呼び出されたときに使用されます (キャッシュホルダについてを参照してください)。
この機能は、オブジェクトのシリアル化が必要であることに注意した上で、大きなオブジェクトをメモリから削除してディスク上にキャッシュする場合に使用します。
動作 メモリおよびディスクキャッシュコンテナは、最大バイトサイズ数を使用して、メモリ内の項目またはディスク上の大きな項目をキャッシュするかどうかを決定します。 この値は、キャッシュマネージャを使用して決定できます。
注記: オブジェクトキャッシュおよびメモリキャッシュではそれぞれ、メモリ内に独自のキャッシュが保持され、個別に管理されます。
次のメソッドの中の1つを使用して、デフォルトのキャッシュマネージャ設定を再設定できます。
DACのキャッシュ設定 Director管理コンソール(DAC)でキャッシュ設定を使用して、Cache Mangerを設定できます。 DACで設定した値は、現在のサーバセッションを越えて保存されることはありません。
config.xmlでのContentCache設定 永久的な変更を行うには、プロジェクトのFrameworkService-confディレクトリに格納されたconfig.xmlでContentCache設定を編集します。 この設定の説明については、を参照してください。
EbiCacheHolderインタフェースでは、セッション実行期間キャッシュホルダ(EbiSession)およびサーバ実行期間キャッシュホルダ(EbiSrvLifetimeCacheHolder)のキャッシュ方法が定義できます。 キャッシュホルダでは、オブジェクトキャッシュコンテナ内、または結合して管理されるメモリおよびディスクキャッシュコンテナ内のコンテンツを保存できます。前の節の説明を参照してください。 (キャッシュマネージャについて)
セッションキャッシュにアクセスするには、EbiSessionの該当するメソッドを呼び出します。 サーバ実行期間キャッシュにアクセスするには、EbiSrvLifetimeCacheHolderの該当するメソッドを呼び出します。 これらのオブジェクトの両方のメソッド(EbiCacheHolderから継承)のいくつかを次に示します。
アプリケーションの要求オブジェクトから直接要求パラメータにアクセスするか、コンテキストオブジェクトの一次値を使用することができます。
注記: たとえばセッションレベルのフェイルオーバーなど、セッションに対する要求値をキャッシュする必要がある場合は、その値をホワイトボードに保存することが必要です。詳細については、ホワイトボードの使用を参照してください。
要求属性は、関連するサーブレットまたはポートレットの要求オブジェクト、つまり、 HttpServletRequest、ActionRequest、またはRenderRequestに保存されます。 これらの属性は、該当する要求オブジェクトのgetAttribute()およびsetAttribute()を使用してアクセスできます。 要求オブジェクトに保存されたオブジェクトは、1つの要求の実行期間にわたり使用できます。 次の要求のために値を保持する場合は、コンテキストオブジェクトを使用します(次の節の説明を参照)。
各要求タイプのラッパオブジェクトを提供する基盤の要求オブジェクトに、EbiRequestインタフェースからアクセスできます。
詳細については、APIヘルプシステムのEbiRequestを参照してください。
EbiContextのget/setTemporaryValue()を使用して、一時値としての要求属性にアクセスすることもできます。 一時値のライフタイムは、EbiContextオブジェクトの一時値のライフタイムと同じです。
たとえば、このコードは要求パラメータを取得し、それを使用して一時値を設定します。 キーは定数USER_CHOICEに保存されます。
String userChoice = context.getEbiRequest().getParameter(USER_CHOICE); if (userChoice != null) context.setTemporaryValue(USER_CHOICE, userChoice);
このメソッドは値を取得します。
String choice = (String) context.getTemporaryValue(USER_CHOICE);
この節では、セッションレベルデータをキャッシュする方法について説明します。
キャッシュマネージャおよびセッションキャッシュホルダを使用すると、メモリやディスクにあるシリアル化可能なあるいはシリアル化不可能なオブジェクトをキャッシュできます。 EbiSessionの該当するメソッドを使用して、オブジェクトキャッシュまたはメモリとディスクを統合したキャッシュのいずれかの中に、データをキャッシュできます。
詳細については、キャッシュマネージャについておよびキャッシュホルダについてを参照してください。
ホワイトボードは、シリアル化されたオブジェクトを保存するためのセッションレベルキャッシュです。 ホワイトボードは、共通に使用される値へのアクセスやセッションレベルフェイルオーバーのために使用できます。 ホワイトボードは、EbiContextの次のメソッドを使用してアクセスできます。
セッションレベルフェイルオーバー セッションレベルフェイルオーバーのために保持するセッション値は、ホワイトボード上にキャッシュする必要があります。 セッションレベルフェイルオーバーとは、クラスタ内のサーバが故障している間に、一時的なユーザデータ(状態)をアプリケーションで保持する機能のことです。 データは、サーバが故障した際にクラスタの任意のサーバによって復元できるように、持続的な記憶リポジトリ(クラスタのサーバで共有されるデータベースまたはファイルシステムなど)に保存されます。
重要: ホワイトボードにキャッシュされたオブジェクトに、java.io.Serializableが実装されていることを確認してください。実装されていなければ、セッションが失敗しても回復できません。
各アプリケーションサーバでは、独自のレベルでセッションレベルフェイルオーバーがサポートされています。 詳細については、アプリケーションサーバのマニュアルを参照してください。
exteNd Application Serverを使用したセッションレベルフェイルオーバーに関する詳細については、Application Server 機能ガイドのサーバ実装ノートに関する章を参照してください。
ポートレットアプリケーションデータは、javax.Portlet規格で定義されているように、PortletSessionオブジェクトまたはPortletContextオブジェクトにキャッシュできます。
PortletSessionインタフェースでは、オブジェクトのキャッシュに対して、次の2つのスコープが定義されます。
APPLICATION_SCOPE このスコープを使用して保存された任意のオブジェクトは、同じセッションのポートとして識別される要求を扱う、同じポートレットアプリケーションに属する任意の他のポートレットから利用できます。
PORTLET_SCOPE このスコープを使用して保存されたオブジェクトは、同じポートレットウィンドウに対する要求の間に、ポートレットから利用可能であることが必要です。
スコープを渡してPortletSessionのsetAttribute()およびgetAttribute()を使用すれば、いずれのスコープでも値にアクセスできます。
詳細については、PortletSessionのAPIマニュアルを参照してください。
注記: exteNd Directorスコープパス機能を使用してこれらのスコープにアクセスすることもできます。詳細については、を参照してください。
コンテキストにキャッシュされた属性は、すべてのユーザおよびポートレットアプリケーションのすべてWebコンポーネントに対してグローバルとなります。 これらの値は、PortletContextオブジェクトのsetAttribute()およびgetAttribute()を使用してアクセスできます。 詳細については、PortletContextのAPIマニュアルを参照してください。
サーバ実行期間キャッシュに保存されたオブジェクトは、パフォーマンス強化のためにキャッシュでき、サーバクラスタ環境の他のサーバと同期させることができます。 この機能は、exteNd Director キャッシュマネージャおよびキャッシュコーディネータを合わせて使用することによって、操作できます。
サーバ実行期間キャッシュホルダ(EbiSrvLifetimeCacheHolder)からputObjectInCache()を呼び出すことによって、サーバ実行期間キャッシュにオブジェクトをキャッシュできます。 キャッシュされたオブジェクトを、javax.io.Serializableとして実装する必要はありません。
サーバ実行期間キャッシュは、各サーバのキャッシュマネージャによって管理されます。 キャッシュされたオブジェクトは、クラスタ環境のデータベースに保存された最新データと同期化されます。 この機能は、「キャッシュコーディネータ」によって操作されます。
exteNd Directorでは、異なるタイプのサブシステムランタイムデータに対する、次のような組み込みサーバ実行期間キャッシュホルダが利用できます。
これらのキャッシュは、Director管理コンソールの「キャッシュホルダ」セクションにリスト表示されています。
Copyright © 2004 Novell, Inc. All rights reserved. Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved. more ...