Oracle9iAS Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス
リリース9.0.3

部品番号 J06903-01
       

Web Object CacheのタグとAPIについて

このトピックでは、OC4Jが提供するアプリケーション・レベルのキャッシング機能であるWeb Object Cacheについて説明します。Javaで作成されたWebアプリケーションでは、Web Object CacheをOracle9iAS Web Cacheとともに使用するとスピードと拡張性が増大します。

このトピックには、次の項目が含まれます。

Webキャッシングの概要およびOracle9iAS Web CacheとOracle9i Application Server Java Object Cacheの説明は、「Webアプリケーションに対するOracleキャッシング・サポートのサマリー」を参照してください。

Web Object Cacheの概要

OC4J Web Object Cacheは、Javaで記述されたWebアプリケーションが、JSPやサーブレットなどの動的Webページが生成した部分的な結果と中間結果を取得、格納、再利用、後処理およびメンテナンスできるようにする機能です。プログラミング・インタフェースについては、タグ・ライブラリ(JSPページでの使用)とJava API(サーブレットでの使用)を備えています。

Web Object CacheはJavaレベルで機能し、JSPアプリケーションとサーブレット・アプリケーションのHTTP環境と緊密に統合されています。キャッシュ内のオブジェクトは、HTMLまたはXMLのフラグメント、XML DOMオブジェクトまたはJavaのシリアル化可能オブジェクトで構成することができます。

Web Object Cacheのプログラミング・インタフェースを使用すると、Webページをページ・ブロックに分割する方法を決定できます。ページ・ブロックでは、キャッシング制御の精度を向上させるために、個別のキャッシュ・オブジェクトを定義します。(ここでは、ブロックとオブジェクトという用語は、同義に使用されています。)これによって、アプリケーション自体が、実行時にキャッシュ・エンティティの存続時間とその他の動作を個別に管理できます。アプリケーション開発者は、自分のアプリケーションのWebページのライフ・サイクル・パターンを一番よく理解しています。したがって、ページをキャッシュ・ブロックに分割する方法を決定する適任者です。部分結果のメンテナンス・ポリシーは、外部ファイルに宣言して指定するか、キャッュ・ポリシー・ディスクリプタに指定するか、またはアプリケーション自体にプログラムで指定できます。

このセクションには、次の項目が含まれます。

Web Object Cacheの利点


注意:

Web Object Cacheは特定の使用例で有用であり、Oracle9iAS Web Cacheなどの他のキャッシング機能の必要性を否定するものではありません。Web Object Cacheの概要、Oracle9iAS Web CacheやOracle9i Application Server Java Object Cacheとの関連、およびそれぞれの適切な使用時期の説明は、「Webアプリケーションに対するOracleキャッシング・サポートのサマリー」を参照してください。


Web Object Cacheを使用することによって、データベースへの問合せやその結果の書式化または変換など、コストのかかる中間処理を伴う動的アプリケーションでの、ページ・ブロックやJavaオブジェクトの構築に要する時間が大幅に削減されます。後続の問合せでは、このキャッシュから情報を取得します。このため、問合せと書式化を繰り返して行う必要がありません。

さらに、開発者は、APIコールやカスタムJSPタグを使用し、プログラムによってキャッシュを厳密に制御できます。これには、キャッシュ・エントリの作成時期、名前の指定、期限切れ時期、参照できるユーザーと参照対象のキャッシュ・データ、結果をユーザーに提示する前にキャッシュ・データに適用できる操作などの制御が含まれます。

一部のWebアプリケーションでは、対象データの特質と使用方法に応じてWeb Object Cacheを使用することで、多くの利点を得ることができます。たとえば、カタログやディレクトリのブラウズ、遅延株式相場およびパーソナライズ・ポータルなどのアプリケーションにとっては、特に大きな利点となります。ただし、リアルタイムの株取引や株式相場などのアプリケーションにとっては、利点となりません。これは、データの更新があまりにも頻繁に行われるため、キャッシング操作のオーバーヘッドによって利点が損なわれてしまうためです。(ただし、このような状況でも、Oracle9iAS Web Cacheが役立つ可能性があります。これはオーバーヘッドが比較的少ないためです。)

通常、Web Object Cacheは、次の場合に最も効果を発揮します。

Web Object Cacheは、サーブレットではなくJSPページで使用すると、特に便利です。JSPコードの生成によって、開発作業を大幅に軽減できます。

Web Object Cacheのコンポーネント

Web Object Cacheは、次の2つの主要コンポーネントで構成されています。

このセクションでは、Web Object Cacheのデフォルトのキャッシュ・リポジトリであるOracle9i Application Server Java Object Cacheの概要についても説明します。

キャッシュ・リポジトリ

キャッシュ・リポジトリは、データの格納、データ配分およびキャッシュの期限切れに関連したコンポーネントです。プログラム可能なWebキャッシュ(Web Object Cacheなど)には、層やプラットフォームに応じて、複数のリポジトリ実装が可能です。たとえば、ファイル・システムを中間層の2次記憶装置として使用し、データベース表をデータベース層の1次記憶域として使用できます。

Web Object Cacheは、Oracle9i Application Server Java Object Cacheをデフォルトのリポジトリとして使用します。これは、Javaアプリケーションで使用するために設計された汎用のキャッシング・サービスとAPIで、オブジェクトには名前でアクセスできます。

Java Object Cacheは、強力で柔軟性の高いプログラミング機能です。キャッシュできるオブジェクトの種類や生成元に制限はありません。各オブジェクトの管理は簡単にカスタマイズできます。各オブジェクトには、次のような一連の属性があります。

オブジェクトはグループ単位または個別に失効化できます。

詳細は、『Oracle9iAS Containers for J2EEサービス・ガイド』を参照してください。


注意:

Java Object Cacheまたはファイル・システムをWeb Object Cacheのバックエンド・リポジトリとして構成する方法の詳細は、「バックエンド・リポジトリの構成」を参照してください。


キャッシュ・プログラミング・インタフェース

フロントエンド・キャッシング・インタフェースは、JSPページおよびサーブレットを介してHTTP処理を実行し、キャッシュ・ポリシー(キャッシュの動作を決定するルールと仕様)に関連するセマンティクスを指示するために使用します。

OC4J Web Object Cacheのプログラミング・インタフェースは、次のように分割できます。

このトピックでは、これらのプログラミング・インタフェースとキャッシュ・リポジトリとの相互作用について説明します。キャッシュ・タグについては、「Web Object Cacheタグの説明」で説明します。基礎となるキャッシュ・ポリシーAPIについては、「Web Object Cache Servlet APIの説明」で説明します。サーブレットでは、基礎となるAPIを使用し、JSPページでは通常、より便利なタグを使用します。

キャッシュ・ポリシーとスコープ

キャッシュ・ポリシーとは、キャッシュの詳細とその動作を決定する一連の仕様です。次の項目が含まれます。

キャッシュ・ポリシーの仕様(「ポリシー仕様の属性と使用」を参照)は、次のいずれかを使用して設定できます。

キャッシュ・ポリシー・オブジェクト(oracle.jsp.jwcache.CachePolicyクラスのインスタンス)は、これらの入力に基づいたポリシー設定を使用して作成されます。期限切れポリシーは、キャッシュ・ポリシーの一部であるため、各CachePolicyオブジェクトには、oracle.jsp.jwcache.ExpirationPolicyクラスのインスタンスである属性が含まれます。

キャッシュ・データは、session scope(現行のHTTPセッションに対してのみ使用可能な場合)またはapplication scope(アプリケーションの全ユーザーに対して使用可能な場合)のいずれかになります。

たとえば、口座の残高をキャッシュするオンライン銀行取引のアプリケーションを考えてみます。この情報に関心があるのは、現行のユーザーのみです。したがって、sessionスコープが適切です。

一方、全ユーザーに対して同じ汎用製品を推奨する「ようこそ」ページを持つオンライン・ストアについて考えてみます。この場合のページにはapplicationスコープを持つキャッシュの使用が適切です。

Web Object Cacheの主要機能

このセクションでは、Web Object Cacheの主要機能について説明します。次の機能が含まれます。

キャッシュ・ブロックのネーミング: 暗黙的なネーミングと明示的なネーミングの比較

キャッシュ・ブロックは、キャッシュ・ブロック名に関連付けられています。キャッシュ・ブロック名は、キャッシング・ポリシーによって暗黙的(通常はこれを推奨)に、またはアプリケーション・コードによって明示的に決定できます。ページ取得時には、対象のページ・フラグメントの再生成を回避するために、キャッュ・ブロック名をルックアップします。

暗黙的なネーミングの場合は、次の2つを入力します。

ほとんどの場合、暗黙的なネーミングで指定された名前には、十分な情報が含まれています。これは、通常、Webアプリケーションに対するすべての入力(アプリケーションで生成する内容を決める入力)がHTTPリクエストに含まれているためです。

ただし、明示的なネーミングのほうが適切な場合があります。たとえば、ユーザー・グループが同じデータを共有する場合です。この場合は、関連する識別情報がユーザーのHTTPリクエストから直接使用できないため、暗黙的なキャッシュ名が役に立たないためです。かわりに、そのグループを識別するャッシュ名を明示的に生成するコードを作成します。名前生成ロジックには、アプリケーション内に存在する他の状態ではなく、リクエスト・ラメータのみを入力として使用することをお薦めします。これによってセマンティクスをたどり、コードをデバッグすることが容易になります。

次に明示的なネーミングの例を示します。cacheタグでは、someMethod()をコールするJSP式を含むname属性によって、キャッュ・ブロック名が設定されます。


<ojsp:cache policy="/WEB-INF/policy1.cpd"
            name="<%= someObj.someMethod() %>" >
...static text...
<% // dynamic content ... %>
</ojsp:cache>

次の例では、name属性がcacheタグ内に存在しないため、キャッシュ・ブロック名はHTTPリクエストとキャッシュ・ポリシーに基づいて暗黙的に決定されます。


<ojsp:cache policy="/WEB-INF/policy2.cpd" >
...static text...
<% // dynamic content ... %>
</ojsp:cache>

詳細は、「キャッシュ・ブロックのネーミングとautoType属性の詳細」を参照してください。


注意:

キャッシュ・ブロックは、ネストできます。この場合、内部キャッシュ・ブロックのロジックは、外部ブロックのコンテンツの再生成が必要な場合のみ実行されます。


クローン化可能なキャッシュ・オブジェクト

OC4J Web Object Cacheには、oracle.jsp.jwcache.CloneableCacheObjインタフェースが備わっています。このインタフェースは、クローン化可能にする必要があるシリアル化可能なキャッシュ・オブジェクトに実装できます。シリアライズされずに、キャッシュされた変更可能なオブジェクトに対して、クローニングは、キャッシュ・オブジェクトの完全な階層コピーを作成するのに有効です。このセクションでは、クローニングの有用性について説明します。最初に必要なバックグラウンド情報を説明します。

メモリー指向リポジトリと2次記憶装置リポジトリとの比較

Web Object Cacheのバックエンドとして使用できるリポジトリには、次の2つのカテゴリがあります。

2次記憶装置リポジトリでは、キャッシュ操作時にJavaのシリアライズが必要です。キャッシュへの格納時、オブジェクトはリポジトリにシリアライズされます。キャッシュからの取得時、そのオブジェクトはメモリーにデシリアライズされます。したがって、シリアライズとデシリアライズ処理の結果、キャッシュ・オブジェクトの完全な個別コピーが各キャッシュ操作時に自動的に作成されます。

これは、キャッシュ・オブジェクトをメモリー指向リポジトリとの間で格納または取得する場合には、当てはまりません。メモリー指向リポジトリでは、ユーザー・アプリケーション内の同一オブジェクトがキャッシュに格納されます。あるいは、キャッシュ内の同一オブジェクトがユーザーのために取得されます。デフォルトでは、コピーは作成されません。複数の取得が行われる場合は、すべての取得で同じオブジェクトが共有されます。

キャッシュ・オブジェクトをクローニングするメリット

多くのアプリケーションでは、異なる取得ごとに、1つのキャッシュ・オブジェクトの異なるコピーを使用したい場合があります。これには2つの主要な理由があります。

この問題を回避するために、汎用のJavaのシリアル化可能データをメモリー指向リポジトリとの間で格納または取得するときは、完全な階層コピーを使用してください。「完全な階層」が意味することは、オブジェクトが参照する直接的なメンバーのみではなく、参照するすべての間接的な変数をコピーすることにあります。たとえば、オブジェクトxyzにメンバー変数としてjava.util.Vectorインスタンスがあるとします。完全な階層コピーのクローニングでは、Vectorインスタンス自体の他に、Vectorインスタンスが参照するすべての変更可能なオブジェクトや要素のコピーが含まれます。

CloneableCacheObjectインタフェースの使用

CloneableCacheObjectインタフェースとそのcloneCacheObj()メソッドをキャッシュ・オブジェクトに実装した場合、Web Object Cacheは、そのキャッシュ・オブジェクトがメモリー指向キャッシュ・リポジトリとの間で格納または取得されると、cloneCacheObj()を自動的にコールし、各キャッシュ・オブジェクトの完全な階層コピーを作成します。

OC4Jのデモ(useCacheObjタグを使用して汎用Javaオブジェクトをキャッシュする)では、クローン化可能なキャッシュ・オブジェクトの使用について具体的に説明します。

キャッシュ・ブロックのランタイム機能

実行時にWeb Object Cacheキャッシュ・タグが検出されると、タグ・ハンドラは、対応するキャッシュ・オブジェクトが存在するかどうか、そのオブジェクトが最近作成されたもので再利用可能であるかどうかをチェックします。再利用可能な場合、タグ・ボディ内のコードは実行されずに、そのキャッシュ・オブジェクトが再利用されます。ただし、そのキャッシュ・オブジェクトが存在しない場合や古すぎる場合は、タグ・ボディのコードが実行され、新規オブジェクト(ページ・フラグメント、XML DOMオブジェクトまたはJavaのシリアル化可能オブジェクト)が生成されます。次に、この新しく生成されたオブジェクトは、特別なバッファ書込みまたはオブジェクトの受渡しによって取得され、キャッシュに格納されます。

コンテンツ生成に複雑なデータベース問合せなどが含まれ、コストがかかる場合、およびキャッシュの存続時間が適切であるためにキャッシュ内のデータが再利用可能な場合は、Web Object Cacheによって、時間とシステム・リソースを大幅に節約できます。また、アプリケーションのスピードとスループットが大幅に改善されます。

データの失効化と期限切れ

キャッシュ・ブロックは、指定した継続時間後または指定時刻に期限切れとなるように設定できます。またはメソッド・コールやタグの起動によって明示的に失効化できます。

キャッシュ・ブロックの期限切れ

キャッシュ・ブロックは主に準静的なフラグメント情報で構成されているため、Oracleの実装には厳密に一貫性のある期限切れモデルは不要です。通常、一貫性の低いモデルでも許容できる結果が得られ、同期によるオーバーヘッドが減少します。

Web Object Cacheブロックのデータの期限切れには、次の2つのカテゴリがあります。

期限切れの詳細は、oracle.jsp.jwcache.ExpirationPolicyクラスのインスタンスにある属性設定によって決定されます。このExpirationPolicyオブジェクトは、キャッシュ・ブロックに関連付けられたCachePolicyオブジェクトの属性です。「期限切れポリシーの属性」を参照してください。

JSPページでは、ExpirationPolicy属性をWeb Object Cacheキャッシュ・タグの属性(cachecacheXMLObjまたはuseCacheObj)を使用して設定できます。サーブレットでは、ExpirationPolicyオブジェクトのメソッドを直接使用できます。(「ExpirationPolicyメソッド」を参照。)あるいは、キャッシュ・ポリシー・ディスクリプタを使用して、ExpirationPolicy属性を設定できます。(「キャッシュ・ポリシー・ディスクリプタ」を参照。)

キャッシュ・ブロックの失効化

期限切れに基づいてキャッシュを無効にするかわりに、次の方法を使用してキャッシュを明示的に失効化できます。

ポリシー仕様の属性と使用

このセクションでは、キャッシュ・ポリシーの属性、特にCachePolicyクラスとExpirationPolicyクラスの属性について説明します。これらの属性は、JSPページではカスタム・タグを使用して設定でき、サーブレットでは付属のJava APIを使用して直接設定できます。キャッシュ・ポリシー・ディスクリプタ・ファイルを使用しても設定できます。

キャッシュ・ポリシーの属性

キャッシュ・ポリシーについては、「キャッシュ・ポリシーとスコープ」で説明しています。このポリシーは、キャッシュ・ブロックの動作を決定する詳細な項目で構成されています。後続のセクションで説明するように、キャッシュ・ポリシーの属性は複数の方法で設定できます。

キャッシュ・ポリシー設定を指定すると、結果的にキャッシュ・ポリシー・オブジェクトが作成されます。このオブジェクトには、期限切れポリシー・オブジェクトが属性の1つとして含まれます。次の短縮コードはCachePolicyクラス(oracle.jsp.jwcacheパッケージ内)のコードで、キャッシュ・ポリシー属性の名前を示しています。ただし、このコードは説明用のコードです。


class CachePolicy
{
   boolean ignoreCache;
   int scope;
   int autoType;
   String selectedParameters[];
   String selectedCookies[];
   Date reusableTimeStamp;
   long reusableDeltaTime;
   ExpirationPolicy expirationPolicy;
   String cacheRepositoryName;
   boolean reportException;
}


注意:

後述する整定数に対する名前は、サーブレットで使用される名前です。Web Object Cacheタグには様々な名前を使用できます。「Web Object Cacheのcacheタグ」を参照してください。


キャッシュ・ポリシー属性の説明

表7-1で、キャッシュ・ポリシー・オブジェクトの属性について説明します。

表7-1 キャッシュ・ポリシー属性の説明 
属性 説明

ignoreCache

boolean

開発時専用の属性です。コードを頻繁に変更する場合は、この属性をtrueに設定してキャッシュを無効にします。その結果、通常、変更前に生成された結果が戻ることはありません。

デフォルト: false

scope

int

キャッシュのスコープを指定します。現行のHTTPセッションのみにアクセスできるキャッシュ・ブロックには、整定数SCOPE_SESSIONを、アプリケーションの全HTTPセッションにアクセスできるキャッシュ・ブロックには、SCOPE_APPを使用します。

デフォルト: application

autoType

int

キャッシュ・ブロックのネーミングを明示的または暗黙的に行うかを指定し、暗黙的なネーミングの場合はHTTPリクエストのプロパティをキャッシュ・ブロックのネーミングで使用する方法も指定します。この名前は、後続リクエストでそのキャッシュが再利用される時点を決定するときに必要です。「キャッシュ・ブロックのネーミングとautoType属性の詳細」を参照してください。

デフォルト: 暗黙的。URIと全パラメータおよび選択したCookieに従います。(TYPE_URI_ALLPARAM

selectedParameters[]

String []

キャッシュ・ブロックのネーミングで使用するために選択したリクエスト・パラメータの名前です。autoTypeとともに使用します。「キャッシュ・ブロックのネーミングとautoType属性の詳細」を参照してください。

デフォルト: null

selectedCookies[]

String[]

キャッシュ・ブロックのネーミングで使用するために選択したCookieの名前です。autoTypeとともに使用します。「キャッシュ・ブロックのネーミングとautoType属性の詳細」を参照してください。

デフォルト: null

reusableTimeStamp

java.util.Date

キャッシュの使用可能性に対する絶対制限時間。この制限時間より前に作成されたすべてのキャッシュ・ブロックは、再利用されません。かわりに、データが再生成されますが、キャッシュ・ブロックの変更はありません。「reusableTimeStampとreusableDeltaTimeの詳細」を参照してください。

reusableTimeStampに関しては、次の点に注意してください。

  • この属性は、1970年1月1日午前0時から任意の絶対制限時間までをミリ秒で、またはjava.util.Dateインスタンスとして表すことができます。他のフォーマットは、cacheタグを使用すると利用可能です。「Web Object Cacheタグの説明」を参照してください。

  • この属性は、reusableDeltaTimeよりも優先されます。

  • この属性の値が整定数REUSABLE_ALWAYSまたは文字列定数REUSABLE_IGNOREDとして設定されている場合、キャッシュ・エントリは、キャッシュ内にあるかぎり常に再利用できます。

  • この属性は、XMLキャッシュ・ポリシー・ディスクリプタ・ファイルでは使用できません。

デフォルト: 常に再利用可能

reusableDeltaTime

long

キャッシュの使用可能性に対する相対制限時間。キャッシュ・ブロックの作成時間と現在の時間の差がreusableDeltaTimeより大きい場合、キャッシュ・ブロックは再利用されません。かわりに、データが再生成されますが、キャッシュ・ブロックの変更はありません。「reusableTimeStampとreusableDeltaTimeの詳細」を参照してください。

reusableDeltaTimeに関しては、次の点に注意してください。

  • この属性は秒単位で指定します。

  • reusableTimeStamp属性によってオーバーライドされます。

  • この属性の値が整定数REUSABLE_ALWAYSまたは文字列定数REUSABLE_IGNOREDとして設定されている場合、キャッシュ・エントリは、キャッシュ内にあるかぎり常に再利用できます。

デフォルト: 常に再利用可能

expirationPolicy

ExpirationPolicy

期限切れポリシー・オブジェクト(oracle.jsp.jwcache.ExpirationPolicyのインスタンス)。リポジトリによってキャッシュ・ブロックが記憶域から削除される状況を指定します。

デフォルト: デフォルトの期限切れポリシー・オブジェクト

期限切れポリシー・オブジェクト、パラメータおよびデフォルトの詳細は、「期限切れポリシーの属性」を参照してください。

cacheRepositoryName

String

キャッシュ・リポジトリの名前。各キャッシュ・ポリシーは、独自のリポジトリを使用できます。

キャッシュ・リポジトリの構成は、/WEB-INF/wcache.xmlファイルに定義されています。

デフォルト: 「DefaultCacheRepository」

reportException

boolean

この属性をfalseに設定すると、ほとんどのキャッシュ操作障害がサイレント状態になり、例外がブラウザにレポートされなくなります。

デフォルト: true

キャッシュ・ブロックのネーミングとautoType属性の詳細

「キャッシュ・ブロックのネーミング: 暗黙的なネーミングと明示的なネーミングの比較」で説明したように、キャッシュ・ブロックの名前は暗黙的(自動ネーミングとも呼ばれます)または明示的(ユーザー・ネーミングとも呼ばれます)に指定できます。

具体的には、キャッシュ・ブロックのネーミングには、6つの方法があります。最初の方法は、明示的なネーミングです。この方法は、TYPE_USERSPECIFIED(整定数)のautoType設定によって指定します。

他の5つの方法は、暗黙的なネーミングのバリエーションです。

たとえば、各ユーザー用にパーソナライズした挨拶文を含むJSPページwelcome.jspを開発したと仮定します。パーソナライズされた挨拶文を含むデータは、そのページにある唯一のキャッシュ・ブロックです。

さらに、「リクエストURI+選択したパラメータ+選択したCookie」に基づくネーミングを指定したと仮定します。この場合、キャッシュ・ブロックのネーミングに選択したパラメータは、userのみで、Cookieは選択していません。

このページが次のようにリクエストされたと仮定します。


http://host:port/a.jsp?user=Amy

この場合、a.jsp?user=Amyがキャッシュ・ブロックの名前になります。

さらに、このページがその後、別のユーザーによって、次のようにリクエストされたと仮定します。


http://host:port/a.jsp?user=Brian

この場合、Amyキャッシュは再利用されません。これは、userの値が異なるためです。かわりに、新規キャッシュ・ブロックが、a.jsp?user=Brianという名前で作成されます。

その後、最初のユーザーが次のようにリクエストしたと仮定します。


http://host:port/a.jsp?mypar=3&user=Amy

ユーザーが再度Amyであるため、このリクエストでは最初のキャッシュが再利用され、Amyのカスタマイズ情報が再生成されることなく表示されます。myparパラメータは、キャッシング機能とは関係ありません。これは、キャッシュ・ポリシー・オブジェクトのselectedParameters[]リストにこのパラメータが含まれていないためです。おそらくmyparの値はキャッシュ可能なページ出力には関係ないと判断されたためです。

さらに次の後続リクエストを想定します。


http://host:port/a.jsp?yourpar=4&user=Brian&hello=true&foo=barfly

ユーザーが再度Brianであるため、このリクエストでは第2のキャッシュが再利用され、Brianのカスタマイズ情報が再生成されることなく表示されます。yourparhelloおよびfooの各パラメータは、キャッシング機能には無関係です。これは、キャッシュ・ポリシー・オブジェクトのselectedParameters[]リストにこれらのパラメータが含まれていないためです。

reusableTimeStampとreusableDeltaTimeの詳細

再利用可能の概念は、TTLの概念とは異なり、より細かい制御を目的としていることに注意してください。TTLは、キャッシュの一般的な存続期間を制御します。詳細は、の「期限切れポリシーの属性」を参照してください。通常、キャッシュ内のデータの使用を適切に制限するにはTTLのみ必要です。

再利用可能性に関する属性には、reusableTimeStampreusableDeltaTimeがあります。これらは、より特定した使用を目的としており、キャッシュ内のデータの期限切れまたは無効化には影響を与えません。たとえば、Webレポートの更新に対する要件がユーザーによって異なる状況を考えてみます。多くのユーザーが過去の任意の時間に作成されたレポートを受け入れることができる状況で、すべてのユーザーが同じバージョンを見て内容を比較しようと考えているとします。この場合、適切なTTL値は、「1日」です。

また、データの時間によって影響を受ける小グループの特権ユーザーがいると仮定します。このユーザー・グループには、1時間以内の情報が必要であるとします。

この場合、TTLは、すべてのユーザーに対して「1日」に設定されていますが、特権ユーザーに対しては「1時間」のreusableDeltaTime設定が可能です。この設定によって、データが1時間を経過した場合、このキャッシュは特権ユーザーに対しては使用されなくなります。ただし、reusableTimeStampreusableDeltaTimeによるキャッシュの期限切れはありません。また、別の方法でキャッシュに影響を与えることもありません。つまり、キャッシュ内のデータは、特権ユーザー以外のユーザーに対しては、TTLに従ってそのまま使用できます。

特権ユーザー・グループに対する、reusableTimeStampreusableDeltaTimeへの値の設定は、アプリケーション・ロジックに依存します。

期限切れポリシーの属性

期限切れポリシーの概要は、「データの失効化と期限切れ」で説明しています。期限切れポリシーには、キャッシュ・ブロックの期限切れ時点、そのデータが使用不可になる時点およびデータの再生成が必要な時点を決定する詳細が含まれています。(ほとんどの説明で、期限切れポリシーはキャッシュ・ポリシーの一部として考えることができます。)ExpirationPolicy属性は、CachePolicy属性と同様に、次のいずれかの方法で設定できます。

次の短縮コードはExpirationPolicyクラス(oracle.jsp.jwcacheパッケージ内)のコードで、期限切れポリシー属性の名前を示しています。ただし、このコードは説明用のコードです。


class ExpirationPolicy
{
   int expirationType;
   long TTL;
   long timeInaDay;
   int dayInaWeek;
   int dayInaMonth;
   boolean writeThrough;
}

表7-2で、期限切れポリシー・オブジェクトの属性について説明します。


注意:

後述する整定数に対する名前は、サーブレットで使用される名前です。Web Object Cacheタグには様々な名前を使用できます。「Web Object Cacheのcacheタグ」を参照してください。


表7-2 期限切れポリシー属性の説明 
属性 説明

expirationType

int

期限切れポリシーの種類は、次のいずれかです(TYPE_XXXの値は整定数です)。

  • TTL。一定時間後(TTL属性に従って)期限切れになります。TYPE_TTLexpirationType設定で指定します。

  • DAILY。1日の指定した時間に(timeInaDay属性に従って)期限切れになります。TYPE_DAILYexpirationType設定で指定します。

  • WEEKLY。指定した曜日の指定した時間に(dayInaWeek属性とtimeInaDay属性に従って)期限切れになります。TYPE_WEEKLYexpirationType設定で指定します。

  • MONTHLY。指定した日付の指定した時間に(dayInaMonth属性とtimeInaDay属性に従って)期限切れになります。TYPE_MONTHLYexpirationType設定で指定します。

デフォルト: TTL

TTL

long

TTL。キャッシュ・ブロックが有効である期間を秒単位で表します。値は、正数である必要があります。

デフォルト: 300(5分間)

timeInaDay

long

日単位、週単位または月単位の期限切れの時間。午前0時を基点に秒単位で表します。つまり、0(ゼロ)は00:00:00(午前0時)を、86399は23:59:59を表します。

デフォルト: 300(00:05:00)。expirationType=TYPE_TTLの場合は無視されます。

dayInaWeek

int

週単位の期限切れの曜日。timeInaDayで指定した時間に期限切れとなります。WEEKLY_SUNDAYWEEKLY_MONDAYWEEKLY_TUESDAYWEEKLY_WEDNESDAYWEEKLY_THURSDAYWEEKLY_FRIDAYまたはWEEKLY_SATURDAY(整定数)。

デフォルト: WEDNESDAY。expirationType=TYPE_WEEKLY以外の場合は無視されます。

dayInaMonth

int

月単位の期限切れの日付。たとえば、毎月10日の場合は、10を指定します。timeInaDayで指定した時間に期限切れとなります。最大設定数は、そのキャッシュ・ブロックが作成された月の日数です。たとえば、キャッシュ・ブロックが作成されたのが6月の場合、dayInaMonthの設定値が31であっても、有効な値は30です。

デフォルト: 10。expirationType=TYPE_MONTHLY以外の場合は無視されます。

writeThrough

boolean

キャッシュ・リポジトリでキャッシュ・エントリを即時書込みキャッシュとして処理するかどうかを指定するフラグ。指定すると、エントリはファイル・システムやデータベースなどの2次記憶装置に即時に書き込まれます。即時書込みモードでは、これをtrueに設定します。即時書込みキャッシュは、サーバーの再起動や電源障害の後も残ります。

falseに設定すると、キャッシュ・エントリは、遅延書込みキャッシュとして処理されます。この設定は、存続時間が5分や10分と短く、再生成にもコストがかからないキャッシュに適切です。

キャッシュ・リポジトリの中には、即時書込みモードをサポートしていないリポジトリもあれば、必ず即時書込みモードを使用するリポジトリもあります。

デフォルト: true

Web Object Cacheタグの説明

OC4Jが提供するカスタム・タグを使用して、JSPページから、キャッシュ・ポリシーの設定、期限切れポリシーの設定および明示的な失効化などを指定できます。説明は、次のカテゴリで構成されています。

Web Object Cacheクラスは、OC4Jが提供するojsputil.jarファイル内にあります。このファイルがインストール済で、クラスパスに存在していることを確認してください。さらに、Oracle9i Application Server Java Object Cacheをバックエンド・リポジトリとして使用するには、cache.jarファイルがインストール済で、クラスパスに存在している必要があります。このファイルもOC4Jに同梱されています。

Web Object Cacheタグ・ライブラリを使用するには、タグ・ライブラリ・ディスクリプタ・ファイルjwcache.tldが、アプリケーションとともにデプロイされている必要があります。また、ライブラリを使用するJSPページには、適切なtaglibディレクティブが存在する必要があります。Oracle9iASのインストール時、TLDファイルは、予約済のタグ・ライブラリ・ディレクトリに置かれます。taglibディレクティブと予約済のタグ・ライブラリ・ディレクトリの詳細は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。


注意:

  • このタグ構文では、接頭辞「ojsp:」が使用されます。これは、表記規則に従っていますが、必須ではありません。任意の接頭辞をtaglibディレクティブに指定できます。

  • このヘルプのタグ構文規則の詳細は、「タグ構文の表記と意味」を参照してください。

  • Web Object Cacheタグ・ライブラリは、標準ライブラリです。標準JavaServer Pagesタグ・ライブラリのフレームワークに関する一般情報は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。


キャッシュ・タグの説明

このセクションでは、次のタグについて説明します。

このセクションでは、キャッシュ・タグ内でのコードの条件付き実行によって発生する可能性がある問題、およびこの問題の回避策として、キャッシュ・ブロックを個別JSPページに分割し、必要に応じてcacheIncludeタグを使用してページを適切に結合する方法についても説明します。

Web Object Cacheのcacheタグ

このセクションでは、cacheタグの構文と属性について説明します。このタグを使用すると、XMLオブジェクトやJavaのシリアル化可能オブジェクトのキャッシングとは異なり、JSPアプリケーションで一般的なキャッシングを設定できます。


注意:

XMLオブジェクトのキャッシングには、かわりにcacheXMLObjタグを使用します。Javaのシリアル化可能オブジェクトのキャッシングには、useCacheObjタグを使用します。これらのタグは、このセクションで説明するcacheタグのすべての属性をサポートしています。「WebObject CacheのcacheXMLObjタグ」および「Web Object CacheのuseCacheObjタグ」を参照してください。


構文


<ojsp:cache
   [ policy = "filename" ]
   [ ignoreCache = "true" | "false" ]
   [ invalidateCache = "true" | "false" ]
   [ scope = "application" | "session" ]
   [ autoType = "user" | "URI" | "URI_query" | "URI_allParam" |
                 "URI_selectedParam" | "URI_excludedParam" ]
   [ selectedParam = "space-delimited_string_of_parameter_names" ]
   [ selectedCookies = "space-delimited_string_of_cookie_names" ]
   [ reusableTimeStamp = "yyyy.mm.dd hh:mm:ss z" |
                         "yyyy.mm.dd hh:mm:ss" | "yyyy.mm.dd"| "ignored" ]
   [ reusableDeltaTime = "number" | "ignored" ]
   [ name = "blockname" ]
   [ expirationType = "TTL" | "daily" | "weekly" | "monthly" ]
   [ TTL = "number" ]
   [ timeInaDay = "number" ]
   [ dayInaWeek = "Sunday" | "Monday" | "Tuesday" | "Wednesday" |
                  "Thursday" | "Friday" | "Saturday" ]
   [ dayInaMonth = "number" ]
   [ writeThrough = "true" | "false" ]
   [ printCacheBlockInfo = "true" | "false" ]
   [ printCachePolicy = "true" | "false" ]
   [ cacheRepositoryName = "name" ]
   [ reportException = "true" | "false" ] >

...Code for cache block...

</ojsp:cache>


注意:

  • このタグは、必要に応じて、次のようなボディなしの単一タグにすることもできます。

    
    <ojsp:cache ... />
    
    
  • 主なデフォルト値は、TTL 300秒、dayInaMonth 10(月の10日目)、キャッシュ・リポジトリ名DefaultCacheRepositoryです。


属性

cacheタグのパラメータのほとんどは、このトピックの前半で説明したCachePolicyクラスまたはExpirationPolicyクラスの属性に対応しています(以降に参照先を示しています)。


注意:

この属性を汎用的なinvalidateCacheタグと混同しないでください。「Web Object CacheのinvalidateCacheタグ」を参照してください。invalidateCache属性は、個別のキャッシュ・ブロックの失効化に使用する特殊なまたは拡張された属性です。


使用上の注意

例: cacheタグ

次の例では、cacheタグを使用して、一連の項目を表示およびキャッシュします。


<%@ taglib uri="/WEB-INF/jwcache.tld" prefix="ojsp" %>
<title>listitem.jsp</title>
<%
   String itemid=request.getParameter("itemid");
   if (itemid==null) {
     out.println("Please select a category from the above drop down box.");
     return;
   }
%>
<% long l1=(new java.util.Date()).getTime(); %>
<ojsp:cache autoType="URI_selectedParam" selectedParam="itemid"
  printCacheBlockInfo="true" printCachePolicy="true"
  policy="/WEB-INF/test-policy.cpd"
>
   Item List: <b><%= itemid %></b><br>
   Time: <%= new java.util.Date() %>
   <br>
   <jsp:useBean class="java.util.Hashtable" id="table" scope="application" />
   <hr>
   <%
     Vector list=(Vector) table.get(itemid);
     if (list==null) {
       out.println("No such item!");
     }
     else {
       for (int i=0; i<list.size(); i++) {
   %>
   <%= list.elementAt(i) %><br>
   <%
       }
     }
   %>
   timestamp:<%= new java.util.Date() %>
   <br>
</ojsp:cache>
<% long l2=(new java.util.Date()).getTime(); %>
Time for general cache operation:<%= l2-l1 %>
<br>

Web Object CacheのcacheXMLObjタグ

通常、XML DOMオブジェクトをキャッシュする場合は、cacheタグではなく、cacheXMLObjを使用します。

cacheXMLObjタグは、「Web Object Cacheのcacheタグ」で説明したcacheタグのすべての属性、およびこのセクションで説明する属性をサポートしています。

構文( cacheタグの構文に追加)


<ojsp:cacheXMLObj
   ...
   [ fromXMLObjName = "objectname" ]
   [ toXMLObjName = "objectname" ]
   [ toWriter = "true" | "false" ] >

...Code for cache block...

</ojsp:cacheXMLObj>


注意:

  • このタグは、必要に応じて、次のようなボディなしの単一タグにすることもできます。

    
    <ojsp:cacheXMLObj ... />
    
    
  • また、このタグをXMLタグ・ライブラリにコピーし、xml.tldタグ・ライブラリ・ディスクリプタ・ファイルに定義すると便利です。

  • このタグは、XMLプロデューサとXMLコンシューマの両方の役割を果たします。XMLオブジェクトが暗黙的に渡されている場合、fromXMLObjNametoXMLObjNameは使用しないでください。(「XMLプロデューサとXMLコンシューマ」を参照。)


属性( cacheタグの属性に追加)


注意:

cacheXMLObjタグは、OC4Jが提供する複数のカスタム・タグの1つで、XMLに関連したタグです。これらのタグは、場合により(あるいは常に)、XMLオブジェクトを入力として取得したり、出力として作成します。この他に、この種のタグには、SQLライブラリのdbQueryタグ(問合せ結果をXML DOMオブジェクトとして出力できます)およびXMLライブラリのtransformタグとstyleSheetタグ(XMLオブジェクトを入力として取得し、XSLT変換を使用して別のXMLオブジェクトまたはJSP Writerを出力として作成できます)があります。これらのタグは、XMLデータの明示的な受渡し用にfromXMLObjName属性とtoXMLObjName属性を持つことで一致しています。詳細は、「XMLロデューサとXMLコンシューマ」を参照してください。


例: cacheXMLObjタグ

この例では、Web Object Cacheタグ、JESIタグおよびXMLとSQLのタグ・ライブラリのタグが使用されています。(JESIタグについては、「Oracle JESIタグの説明」、XML transformタグについては、「XMLユーティリティ・タグ」、SQLタグについては、「データ・アクセス用SQLタグ」を参照してください。)

SQL dbOpenタグとSQL dbQueryタグは、データベースに接続して、問合せを実行します。cacheXMLObjタグは、問合せによって作成されたXML DOMオブジェクトをキャッシュするため、後続の実行(異なるスタイルシートによる出力など)では、問合せの再実行は不要です。これは、Web Object CacheからDOMオブジェクトを取得できるためです。XML transformタグは、問合せ結果をXMLスタイルシート(変数で指定)に基づいて出力します。JESI fragmentタグによって、キャッシュ対象のHTML出力が囲まれます(アプリケーション・レベルのキャッシングは不要です)。JESI templateタグは、フラグメント以外のキャッシングを(cache="no"の設定によって)無効にします。


<jesi:template cache="no">
<% String userStyleLoc="style/rowset.xsl"; %>
<h3>Transform DBQuery Tag Example</h3>
<h4>Current Time=<%= new java.util.Date() %></h4>
<jesi:fragment expiration="60">
<!-- You can cache HTML in Oracle9iAS Web Cache with JESI
  or you can cache it in Oracle Web Object Cache -->
<h4>Cached Time=<%= new java.util.Date() %></h4>
<sql:dbOpen connId="conn1" URL="<%= connStr %>"
              user="scott" password="tiger" />
<xml:transform href="<%= userStyleLoc %>" >
<%-- The XML DOM object is produced by dbQuery
  And, the DOM object is cached in Oracle Web Object Cache.
  XSLT is performed on the cached object. --%>
  <ojsp:cacheXMLObj TTL="60" toWriter="false">
    <sql:dbQuery connId="conn1" output="xml" queryId="myquery" >
       select ENAME, EMPNO from EMP
    </sql:dbQuery>
  </ojsp:cacheXMLObj>
</xml:transform>
<sql:dbCloseQuery queryId="myquery" />
<sql:dbClose connId="con1" />
</jesi:fragment>
</jesi:template>

Web Object CacheのuseCacheObjタグ

シリアル化可能なすべてのJavaオブジェクトをキャッシュするには、useCacheObjタグを使用します。

useCacheObjタグは、「Web Object Cacheのcacheタグ」で説明したcacheタグのすべての属性、およびこのセクションで説明する属性をサポートしています。

構文( cacheタグの構文に追加)


<ojsp:useCacheObj
   ...
     type="classname"
     id = "instancename"
   [ cacheScope = "application" | "session" ] >

...Code for cache block...

</ojsp:useCacheObj>


注意:

  • このタグは、必要に応じて、次のようなボディなしの単一タグにすることもできます。

    
    <ojsp:useCacheObj ... />
    
    
  • id属性とtype属性は、リクエスト時属性でないため、JSPの実行時の式を使用して設定することはできません。


属性( cacheタグの属性に追加)

このセクションで説明するtype属性とid属性は、標準のjsp:useBeanタグのtype(またはclass)属性とid属性と同じように使用されます。

例: useCacheObjタグ


<ojsp:useCacheObj id="a2" policy="/WEB-INF/test-policy.cpd"
  type="examples.RStrArray" >
<%
   // create a temp writeable array
   WStrArray tmpa2=new WStrArray(3);
   tmpa2.setStr(2,request.getParameter("testing4"));
   tmpa2.setStr(1,"def");
   tmpa2.setStr(0, (new java.util.Date()).toString() );
   // create a readonly copy for the cache
   a2=new RStrArray(tmpa2);
   // storing the a2 into pagecontext
   // so useCacheObj tag can pick it up
   pageContext.setAttribute("a2",a2);
%>
</ojsp:useCacheObj>

Cacheタグ内でのコードの条件付き実行

cacheタグ(cachecacheXMLObjまたはuseCacheObj)内のコードは条件付きで実行されます。特に次のような場合が該当します。

cacheタグ(cacheXMLObjuseCacheObjではなく)を使用している場合は、キャッシュ・ブロックを個別のJSPページに分割することによって、この種の状況に陥る可能性が少なくなります。この場合、各キャッシュ・ブロックは、独自のURIで表します。必要に応じて動的インクルード機能を使用すると、これらのページを結合できます。

この操作をさらに簡単にするために、OracleはcacheIncludeタグを用意しています。次のセクションの「Web Object CacheのcacheIncludeタグ」で説明します。

Web Object CacheのcacheIncludeタグ

cacheIncludeタグは、cacheタグ(ただし、cacheXMLObjタグやuseCacheObjタグを除く)の機能と標準のjsp:includeタグの機能を結合します。

キャッシュ・ブロックの個別ページへの配置およびcacheIncludeタグの使用は、モジュール性や透明性、さらに前述の「Cacheタグ内でのコードの条件付き実行」で説明した問題などを考慮すると、多くのメリットがあります。

ただし、次の制限事項に注意してください。

これらの制限が問題になる場合は、cacheタグとincludeタグを個別に使用します。

cacheIncludeタグとJESI includeタグの間の重要な違いにも注意してください。(このタグの詳細は、「JESI includeタグ」を参照してください。)Oracle9iAS WebCacheは、Web Object Cacheとは異なるキャッシング・レイヤーにあるため、JESI includeタグのインクルード先ページとインクルード・ページは、同じリクエスト・オブジェクトを共有できません。cacheIncludeタグには、このような制限はありません。インクルード先ページとインクルード・ページは、同じリクエスト・オブジェクトを共有します。その結果、Beanとrequestスコープの属性をこの2つのページ間で相互に渡すことができます。

構文


<ojsp:cacheInclude
     policy = "filename"
     page = "URI"
   [ printCacheBlockInfo = "true" | "false" ]
   [ reportException = "true" | "false" ] >

...Code for cache block...

</ojsp:cacheInclude>


注意:

cacheIncludeタグの場合は、policypageがリクエスト時属性でないため、JSPの式を使用してその値を決定することはできません。(cacheタグ、cacheXMLObjタグおよびuseCacheObjタグの場合、policyは、リクエスト時属性です。)


属性

使用上の注意

次のcacheIncludeタグの使用方法について考えてみます。


<ojsp:cacheInclude page="anotherPage.jsp" policy="foo.cpd" >

これは、次の例と同じです。


<ojsp:cache policy="foo.cpd" >
   <% pageContext.include("anotherPage.jsp"); %>
</ojsp:cache>

または、次の例と同じです。


<jsp:include page="anotherPage.jsp" flush="true" />

anotherPage.jspは、次のように構成されています。


<ojsp:cache policy="foo.cpd" >
...anotherPage.jsp contents...
</ojsp:cache>

キャッシュ失効化タグの説明

このセクションでは、invalidateCacheタグの使用方法を説明します。

Web Object CacheのinvalidateCacheタグ

キャッシュ・ブロックをプログラム・ロジックを使用して明示的に失効化する場合は、invalidateCacheタグを使用できます。このセクションでは、このタグの構文と属性について説明します。


注意:

  • invalidateCacheタグは、新規のCookieを受け入れません。したがって、使用できるのは、現行のHTTPリクエストの既存のCookieのみです。新規Cookieの入力の詳細は、「CachePolicyメソッド」を参照してください。

  • invalidateCacheタグをキャッシュ・タグのinvalidateCache属性と混同しないでください。この属性には、既存のキャッシュ・オブジェクトを失効化するという制限があります。


構文


<ojsp:invalidateCache
   [ policy = "filename" ]
   [ ignoreCache = "true" | "false" ]
   [ scope = "application" | "session" ]
   [ autoType = "user" | "URI" | "URI_query" | "URI_allParam" |
                "URI_selectedParam" | "URI_excludedParam" ]
   [ selectedParam = "space-delimited_string_of_parameter_names" ]
   [ selectedCookies = "space-delimited_string_of_cookie_names" ]
   [ name = "blockname" ]
   [ invalidateNameLike = "true" | "false" ]
   [ page = "URI" ]
   [ autoInvalidateLevel = "application" | "page" | "param" | "cookie" ]
   [ cacheRepositoryName = "name" ]
   [ reportException = "true" | "false" ] />


注意:

autoInvalidateLevelのデフォルト値は、ページURIの仕様によって決まります。「pageとautoInvalidateLevelの使用」を参照してください。


属性

invalidateCacheタグのほとんどのパラメータは、cacheタグおよびcacheXMLObjタグにも存在し、同じように使用されます。詳細は、このトピックで前述しています(以降に参照先を示しています)。

nameとinvalidateNameLikeの使用

明示的なキャッシュ・ブロックのネーミングによって名前を指定した1つ以上のキャッシュ・ブロックを失効化するには、name属性とinvalidateNameLike属性を次のように併用します。

pageとautoInvalidateLevelの使用

暗黙的なキャッシュ・ブロックのネーミングによって名前を指定した1つ以上のキャッシュ・ブロックを失効化するには、page属性とautoInvalidateLevel属性を併用します。

page属性を使用して、Webページの適切なURIを指定します。(暗黙的なネーミングでは、キャッシュ・ブロック名は、WebページのURIに基づいています。)

autoInvalidateLevelを使用して失効化のスコープ(applicationスコープ、pageスコープ、parameterスコープまたはcookieスコープ)を次のように指定します。


注意:

ページURIに疑問符が含まれている場合、デフォルトのautoInvalidateLevelは、paramです。疑問符が含まれていない場合、デフォルトはpageです。


例: キャッシュ失効化タグの使用

このセクションでは、キャッシュの失効化の簡単な例を示します。キャッシュの失効化を含め、完全なサンプル・アプリケーションは、OC4Jのデモを参照してください。

例: invalidateCacheタグ

次のページでは、以前にキャッシュされた項目リストに1つの項目を追加し、次にそのキャッシュを失効化します。このリストは、後で新規項目によって再度キャッシュされると想定しています。


<%@ taglib uri="/WEB-INF/jwcache.tld" prefix="ojsp" %>
<title>added.jsp</title>
<jsp:useBean class="java.util.Hashtable" id="table" scope="application" />
<%
   String itemid=request.getParameter("itemid");
   String addItem=request.getParameter("addItem");
   Vector list=(Vector) table.get(itemid);
   if (list==null) {
     list=new Vector();
     table.put(itemid,list);
   }
   list.addElement(addItem);
%>
<b><%= addItem %></b> was added into category <b><%= itemid %></b>.<br>
<% String viewPage="listitem.jsp?itemid="+itemid; %>
<% long l1=(new java.util.Date()).getTime(); %>
<ojsp:invalidateCache page="<%= viewPage %>" autoInvalidateLevel="param"
  policy="/WEB-INF/test-policy.cpd"
    />
<% long l2=(new java.util.Date()).getTime(); %>
Existing cache entry has been invalidated. <br>
Invalidation took <%= l2-l1 %> milliseconds.
<br>
<jsp:include page="<%= viewPage %>" flush="true" />
<br>
<a href="seeitems.jsp" >Select items</a>
or
<a href="additem.html" >Add items</a>
<br>

Web Object Cache Servlet APIの説明

サーブレットから、CachePolicyメソッドを使用して、キャッシュ・ポリシー設定を変更したり、キャッシュ・ブロックを失効化することができます。また、ExpirationPolicyメソッドを使用すると、期限切れ設定を変更できます。このためには、キャッシュ・ポリシー・オブジェクトの作成とその期限切れポリシー・オブジェクト属性の取得(これはJSPキャッシュ・タグ・ハンドラによって自動的に行われます)が必要です。

このセクションでは、次の項目を説明します。

Web Object Cacheクラスは、OC4Jが提供するojsputil.jarファイル内にあります。このファイルがインストール済で、クラスパスに存在していることを確認してください。さらに、Oracle9i Application Server Java Object Cacheをバックエンド・リポジトリとして使用するには、cache.jarファイルがインストール済で、クラスパスに存在している必要があります。このファイルもOC4Jに同梱されています。

このセクションで説明するクラス、インタフェースおよびメソッドの詳細は、OC4Jに付属のJavadocを参照してください。

キャッシュ・ポリシー・オブジェクトの作成

CachePolicyオブジェクトの作成には、次の2つのアプローチがあります。


注意:

キャッシュ・ポリシー・オブジェクトは、データベース接続やカーソルなどのリソース・オブジェクトではありません。したがって、ライフ・サイクル管理やリソース管理を考慮せずに操作できます。


lookupPolicy()メソッドの使用

通常、CachePolicyオブジェクトを作成する最も簡単な方法は、OC4Jが提供するCacheClientUtilクラスの静的lookupPolicy()メソッドを使用する方法です。次に例を示します。


CachePolicy cachePolicyObject = oracle.jsp.jwcache.CacheClientUtil.lookupPolicy
                             (servletConfig, request, "/WEB-INF/foo.cpd");

サーブレット構成オブジェクト(javax.servlet.ServletConfigインスタンス)、リクエスト・オブジェクト(javax.servlet.http.HttpServletRequestインスタンス)およびXMLキャッシュ・ポリシー・ディスクリプタ・ファイルのURIパス(アプリケーションのルートに相対)を入力します。

次に、キャッシュ・ポリシー・ディスクリプタ・ファイルの簡単な例を示します。


<!--
test-policy.cpd
-->

<cachePolicy scope="application">
<expirationPolicy expirationType="TTL" TTL="25" timeInaDay="00:10:00"
writeThrough="true" />
</cachePolicy>

詳細は、「キャッシュ・ポリシー・ディスクリプタ」を参照してください。

CachePolicyコンストラクタの使用

oracle.jsp.jwcache.CachePolicyクラスには、次のパブリック・コンストラクタがあります。サーブレット構成オブジェクトのみを必要とする簡単なコンストラクタ、別のCachePolicyオブジェクトをコピーする「copy」コンストラクタおよび特定のサーブレット構成オブジェクトを含む「copy」コンストラクタです。


public CachePolicy(javax.servlet.ServletConfig config)

public CachePolicy(CachePolicy cPolicy)

public CachePolicy(javax.servlet.ServletConfig config,
                   CachePolicy cPolicy)

CachePolicyメソッド

CachePolicyオブジェクトでは、複数のユーティリティ・メソッドおよび主要属性のgetterメソッドとsetterメソッドを使用できます。

CachePolicyメソッド・シグネチャと共通のパラメータ

次の短縮コードには、CachePolicyオブジェクトで使用可能な主要メソッドのシグネチャが含まれています。ただし、このコードは説明用のコードです。

関連属性の説明は、「キャッシュ・ポリシーの属性」を参照してください。


class CachePolicy
{
   boolean isRecent(CacheBlock block);
   void putCache(Object data, HttpServletRequest req, SectionId sectionId);
   void putCache(Object data, HttpServletRequest req, String specifiedName);
   void putAutoCacheForOtherPath(Object data, HttpServletRequest req,
                       String otherPath, StringSectionid sectionId);
   void putAutoCacheForOtherPath(Object data, HttpServletRequest req,
        String otherPath, Cookie[] newCookies, StringSectionid sectionId);
   CacheBlock getCache(HttpServletRequest req, SectionId sectionId);
   CacheBlock getCache(HttpServletRequest req, String specifiedName);
   CacheBlock getAutoCacheForOtherPath(HttpServletRequest req,
                         String otherPath, StringSectionId sectionId);
   CacheBlock getAutoCacheForOtherPath(HttpServletRequest req,
        String otherPath, Cookie[] newCookies, StringSectionId sectionId);
   void invalidateCache(HttpServletRequest req, SectionId sectionId);
   void invalidateCache(HttpServletRequest req, String specifiedName);
   void invalidateCacheLike(HttpServletRequest req, String specifiedName);
   void invalidateCacheLike(HttpServletRequest req, int autoInvalidateLevel);
   void invalidateCacheLike(HttpServletRequest req, String specifiedName,
                           int autoInvalidateLevel);
   void invalidateCacheOtherPathLike(HttpServletRequest req, String otherPath);
   void invalidateCacheOtherPathLike(HttpServletRequest req, String otherPath,
                         Cookie[] newCookies, int autoInvalidateLevel);
   Date getCurrentTime();
}

これらのメソッドでは、次の複数の共通パラメータが使用されています。


注意:

StringSectionIdインスタンスを構成する場合は、文字列をアルファベット(数値ではなく)文字で開始する必要があります。


CachePolicyメソッドの説明

CachePolicyメソッドは、次のように機能します。


注意:

putCache()メソッドは、キャッシュ・ポリシーのignoreCache属性が「true」の場合、何も実行しません。



注意:

getCache()メソッドは、キャッシュ・ポリシーのignoreCache属性がtrueの場合、何も実行しません。


CachePolicyのgetterメソッドとsetterメソッド

次のメソッドを使用すると、CachePolicyオブジェクトの属性を取得または変更できます。これらの属性の説明は、「キャッシュ・ポリシーの属性」を参照してください。

次のメソッドも使用可能です。ただし、主にWeb Object Cacheタグ・ハンドラによって使用されます。

期限切れポリシー・オブジェクトの取得

CachePolicyオブジェクトには、ExpirationPolicy属性があります。キャッシュ・ブロックに期限切れポリシーを設定する場合は、CachePolicyオブジェクトのgetExpirationPolicy()メソッドを使用できます。次に例を示します。


CachePolicy cachePolicyObj = CacheClientUtil.lookupPolicy
                             (config, request, "/WEB-INF/mypolicy.cpd");
ExpirationPolicy expPolicyObj = cachePolicyObj.getExpirationPolicy();

ExpirationPolicyメソッド

ExpirationPolicyクラスの属性には、次のgetterメソッドとsetterメソッドがあります。これらの属性の説明は、「期限切れポリシーの属性」を参照してください。

さらに、ExpirationPolicyクラスには、次のユーティリティ・メソッドがあります。

ExpirationPolicyクラスは、expirationType属性に対して、次の整定数を定義します。

次の整定数は、dayInaWeek属性に対して定義されます。

CacheBlockメソッド

CachePolicyオブジェクトのgetCache()メソッドを使用すると、関連するCacheBlockオブジェクトを取得できます。詳細は、「CachePolicyメソッド」と次のセクションの「Web Object Cache APIを使用したサンプル・サーブレット」で説明します。

次の短縮コードは、oracle.jsp.jwcache.CacheBlockクラスの主要メソッドを示しています。ただし、このコードは説明用のコードです。


class CacheBlock
{
   long getCreationTime();
   long getExpirationTime();
   Serializable getData();
}

次に、これらのメソッドを簡単に説明します。


注意:

作成時間と期限切れ時間は、1970年1月1日午前0時を基点とするミリ秒で表されます。


Web Object Cache APIを使用したサンプル・サーブレット

次のサンプル・サーブレットDemoCacheServletでは、Web Object Cacheが使用されています。コードの後には、この操作に関するノートが続きます。


package demoPkg;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

import java.io.PrintWriter;
import java.io.CharArrayWriter;

import oracle.jsp.jwcache.CachePolicy;
import oracle.jsp.jwcache.ExpirationPolicy;
import oracle.jsp.jwcache.StringSectionId;
import oracle.jsp.jwcache.CacheBlock;
import oracle.jsp.jwcache.CacheClientUtil;

public class DemoCacheServlet extends HttpServlet{

  public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    // standard writer object from servlet engine
    PrintWriter out=response.getWriter();
    ServletConfig config=getServletConfig();

    try {
      CachePolicy cachePolicyObj = CacheClientUtil.lookupPolicy(config,request,
        "/WEB-INF/test-policy.cpd" );  // Note A
      StringSectionId sectionId=new StringSectionId("s1");   // Note B
      CacheBlock cacheBlockObj=null;

      cacheBlockObj = cachePolicyObj.getCache(request,sectionId); // Note C
      if (!cachePolicyObj.isRecent(cacheBlockObj)) {  // Note D
        CharArrayWriter newOut=new CharArrayWriter();
        PrintWriter pw=new PrintWriter(newOut);

        // actual logic within a cache block
        pw.println("fragment#1");
        pw.println(new java.util.Date());
        // which generates content into the "out" object

        if (cacheBlockObj == null) {   // Note E
          cachePolicyObj.putCache(newOut.toCharArray(),request,sectionId);
          // Note F
        }

        out.write(newOut.toCharArray());
        // writing out newly created data back to the original writer
      }
      else {
        out.write((char[])cacheBlockObj.getData());
        // writing the existing cached data to the writer
      }

      sectionId=new StringSectionId("s2");
      long timeToLive = 15;   // now set TTL to 15 on this block
      ExpirationPolicy expirationPolicy = cachePolicyObj.getExpirationPolicy();
      expirationPolicy.setTTL(timeToLive);
      cachePolicyObj.setExpirationPolicy(expirationPolicy);
      cacheBlockObj = cachePolicyObj.getCache(request,sectionId);
      if (!cachePolicyObj.isRecent(cacheBlockObj)) {
        CharArrayWriter newOut=new CharArrayWriter();
        PrintWriter pw=new PrintWriter(newOut);

        // actual logic within a cache block
        pw.println("fragment#2");
        pw.println(new java.util.Date());
        // which generates content into the "out" object

        if (cacheBlockObj == null) {
          cachePolicyObj.putCache(newOut.toCharArray(),request,sectionId);
        }

        out.write(newOut.toCharArray());
        // writing out newly created data back to the original writer
      }
      else {
        out.write((char[])cacheBlockObj.getData());
        // writing the existing cached data to the writer
      }

    } catch (Throwable th) {
      // your exception handling code here
      th.printStackTrace(out);
    }
  }
}

コード・ノート

前述の例の主要機能について説明します。

タグ・コードとAPIコードの比較

次の例では、2つのキャッシュ・フラグメントからタイムスタンプ出力をキャッシュし、表示するアプリケーションに対する3つのアプローチのコードを示します。

3つのコード・サンプルの後には、キャッシュ・ポリシー・ディスクリプタtest-policy.cpdのリストがあります。

各アプローチで、アプリケーションは、表示する2つのフラグメントをキャッシュします。再ロードを何回行っても、フラグメントに表示される時間は、キャッシュ内のフラグメントが期限切れになるまで変わりません。最初のフラグメントは、キャッシュ・ポリシー・ディスクリプタ(test-policy.cpd)から25秒のTTL値を取得しているため、期限切れまで25秒かかります。第2のフラグメントはキャッシュ・ポリシー・ディスクリプタのTTL値を、ページ・コードに直接設定されている値でオーバーライドしているため、期限切れまで15秒かかります。

サンプル・アプリケーションの出力は、次のようになります。


fragment#1  (expires in 25 seconds as per TTL value test-policy)
Sun May 27 15:20:46 PDT 2001

fragment#2 (expires in 15 seconds because TTL overrides test-policy value)
Sun May 27 15:20:46 PDT 2001

簡単なJSPページ: tagcode.jsp


<%@ taglib uri="/WEB-INF/jwcache.tld" prefix="ojsp" %>
<title>tagcode.jsp</title>
<pre>
tagcode.jsp
<ojsp:cache policy="/WEB-INF/test-policy.cpd" >
  fragment#1  (expires in 25 seconds as per TTL value test-policy)
  <%= new java.util.Date() %>
</ojsp:cache>
<ojsp:cache policy="/WEB-INF/test-policy.cpd" TTL="15" >
  fragment#2 (expires in 15 seconds because TTL overrides test-policy value)
  <%= new java.util.Date() %>
</ojsp:cache>
</pre>

スクリプトレットJSPページ: servletcode.jsp

コード・ノートは、次のサーブレット・バージョンと同じです。「Web Object Cache APIを使用したサンプル・サーブレット」を参照してください。


<%@ page import="oracle.jsp.jwcache.*,java.io.*" %>
<title>servletcode.jsp</title>
<pre>
servletcode.jsp
<%
  CachePolicy cachePolicyObj = CacheClientUtil.lookupPolicy(config,request,
   "/WEB-INF/test-policy.cpd" );  // Note A
  StringSectionId sectionId=new StringSectionId("s1");   // Note B
  CacheBlock cacheBlockObj=null;

  cacheBlockObj = cachePolicyObj.getCache(request,sectionId); // Note C
  if (!cachePolicyObj.isRecent(cacheBlockObj)) {  // Note D
    CharArrayWriter newOut=new CharArrayWriter();
    PrintWriter pw=new PrintWriter(newOut);

    // actual logic within a cache block
    pw.println
("fragment#1 (expires in 25 seconds as per TTL value test-policy)");
    pw.println(new java.util.Date());
    // which generates content into the "out" object

    if (cacheBlockObj == null) {   // Note E
      cachePolicyObj.putCache(newOut.toCharArray(),request,sectionId);
      // Note F
    }

    out.write(newOut.toCharArray());
    // writing out newly created data back to the original writer
  }
  else {
    out.write((char[])cacheBlockObj.getData());
    // writing the existing cached data to the writer
  }

  sectionId=new StringSectionId("s2");
  long timeToLive = 15;   // now set TTL to 15 on this block
  ExpirationPolicy expirationPolicy = cachePolicyObj.getExpirationPolicy();
  expirationPolicy.setTTL(timeToLive);
  cachePolicyObj.setExpirationPolicy(expirationPolicy);
  cacheBlockObj = cachePolicyObj.getCache(request,sectionId);
  if (!cachePolicyObj.isRecent(cacheBlockObj)) {
    CharArrayWriter newOut=new CharArrayWriter();
    PrintWriter pw=new PrintWriter(newOut);

    // actual logic within a cache block
    pw.println
("fragment#2 (expires in 15 seconds because TTL overrides test-policy value)");
    pw.println(new java.util.Date());
    // which generates content into the "out" object

    if (cacheBlockObj == null) {
      cachePolicyObj.putCache(newOut.toCharArray(),request,sectionId);
    }

    out.write(newOut.toCharArray());
    // writing out newly created data back to the original writer
  }
  else {
    out.write((char[])cacheBlockObj.getData());
    // writing the existing cached data to the writer
  }

%>
</pre>

サーブレット・ページ: DemoCacheServlet.java

このサンプルは、「Web Object Cache APIを使用したサンプル・サーブレット」にも示されています。コード・ノートはそちらのページを参照してください。


package demoPkg;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

import java.io.PrintWriter;
import java.io.CharArrayWriter;

import oracle.jsp.jwcache.CachePolicy;
import oracle.jsp.jwcache.ExpirationPolicy;
import oracle.jsp.jwcache.StringSectionId;
import oracle.jsp.jwcache.CacheBlock;
import oracle.jsp.jwcache.CacheClientUtil;

public class DemoCacheServlet extends HttpServlet{

  public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    // standard writer object from servlet engine
    PrintWriter out=response.getWriter();
    ServletConfig config=getServletConfig();

    try {
      CachePolicy cachePolicyObj = CacheClientUtil.lookupPolicy(config,request,
        "/WEB-INF/test-policy.cpd" );  // Note A
      StringSectionId sectionId=new StringSectionId("s1");   // Note B
      CacheBlock cacheBlockObj=null;

      cacheBlockObj = cachePolicyObj.getCache(request,sectionId); // Note C
      if (!cachePolicyObj.isRecent(cacheBlockObj)) {  // Note D
        CharArrayWriter newOut=new CharArrayWriter();
        PrintWriter pw=new PrintWriter(newOut);

        // actual logic within a cache block
        pw.println("fragment#1");
        pw.println(new java.util.Date());
        // which generates content into the "out" object

        if (cacheBlockObj == null) {   // Note E
          cachePolicyObj.putCache(newOut.toCharArray(),request,sectionId);
          // Note F
        }

        out.write(newOut.toCharArray());
        // writing out newly created data back to the original writer
      }
      else {
        out.write((char[])cacheBlockObj.getData());
        // writing the existing cached data to the writer
      }

      sectionId=new StringSectionId("s2");
      long timeToLive = 15;   // now set TTL to 15 on this block
      ExpirationPolicy expirationPolicy = cachePolicyObj.getExpirationPolicy();
      expirationPolicy.setTTL(timeToLive);
      cachePolicyObj.setExpirationPolicy(expirationPolicy);
      cacheBlockObj = cachePolicyObj.getCache(request,sectionId);
      if (!cachePolicyObj.isRecent(cacheBlockObj)) {
        CharArrayWriter newOut=new CharArrayWriter();
        PrintWriter pw=new PrintWriter(newOut);

        // actual logic within a cache block
        pw.println("fragment#2");
        pw.println(new java.util.Date());
        // which generates content into the "out" object

        if (cacheBlockObj == null) {
          cachePolicyObj.putCache(newOut.toCharArray(),request,sectionId);
        }

        out.write(newOut.toCharArray());
        // writing out newly created data back to the original writer
      }
      else {
        out.write((char[])cacheBlockObj.getData());
        // writing the existing cached data to the writer
      }

    } catch (Throwable th) {
      // your exception handling code here
      th.printStackTrace(out);
    }
  }
}

キャッシュ・ポリシー・ディスクリプタ: test-policy.cpd

このキャッシュ・ポリシー・ディスクリプタは、サンプル・アプリケーションへの3つのアプローチ(tagcode.jspservletcode.jspおよびDemoCacheServlet.java)すべてで使用されます。


<!--
test-policy.cpd
-->

<cachePolicy scope="application">
<expirationPolicy expirationType="TTL" TTL="25" timeInaDay="00:10:00"
writeThrough="true" />
</cachePolicy>

キャッシュ・ポリシー・ディスクリプタ

XMLスタイルのキャッシュ・ポリシー・ディスクリプタを使用することによって、CachePolicyオブジェクトとExpirationPolicyオブジェクトの属性設定を指定できます。使用するJSPページまたはサーブレットで、cacheタグ、cacheXMLObjタグ、useCacheObjタグ、cacheIncludeタグまたはinvalidateCacheタグのpolicy属性を使用してキャッシュ・ポリシー・ディスクリプタを指定します。

このセクションでは、キャッシュ・ポリシー・ディスクリプタDTD、サンプル・キャッュ・ポリシー・ディスクリプタおよびキャッシュ・ポリシー・ディスクリプタのロードとリフレッシュに関する情報を示します。

キャッシュ・ポリシー・ディスクリプタDTD

このセクションでは、Web Object Cacheのキャッシュ・ポリシー・ディスクリプタDTD、cachepolicy.dtdのリストを示します。キャッシュ・ポリシー・ディスクリプタの例は、「サンプル・キャッシュ・ポリシー・ディスクリプタ」を参照してください。


<!--
cachepolicy.dtd
-->
<!--
This DTD is used to validate any (Oracle programmable web)
cache policy descriptors (e.g. "/WEB-INF/foo.cpd").
-->

<!--
The cachePolicy element is the root element of cache policy descriptors.
configuration descriptor.
-->

<!ELEMENT cachePolicy (
   selectedParam*, selectedCookie*,
   reusableTimeStamp?, reusableDeltaTime?,
   cacheRepositoryName?, expirationPolicy? ) >

<!ATTLIST cachePolicy ignoreCache (true | false) "false" >
<!ATTLIST cachePolicy scope (application | session) "application" >
<!ATTLIST cachePolicy autoType
   (user | URI | URI_query |
    URI_allParam | URI_selectedParam | URI_excludedParam )
    "URI_allParam" >
<!ATTLIST cachePolicy reportException (true | false) "true" >

<!ELEMENT selectedParam (#PCDATA) >
<!ELEMENT selectedCookie (#PCDATA) >
<!ELEMENT reusableTimeStamp (#PCDATA) >
<!ELEMENT reusableDeltaTime (#PCDATA) >
<!ELEMENT cacheRepositoryName (#PCDATA) >

<!ELEMENT expirationPolicy EMPTY >

<!ATTLIST expirationPolicy expirationType (TTL | daily | weekly | monthly)
         "TTL" >
<!ATTLIST expirationPolicy TTL CDATA "300" >
<!ATTLIST expirationPolicy timeInaDay CDATA #IMPLIED >
<!ATTLIST expirationPolicy dayInaWeek
   (Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday)
   "Wednesday" >
<!ATTLIST expirationPolicy dayInaMonth CDATA "10" >
<!ATTLIST expirationPolicy writeThrough (true | false) "true" >

サンプル・キャッシュ・ポリシー・ディスクリプタ

このセクションでは、TTL属性とtimeInaDay属性を設定する簡単なキャッシュ・ポリー・ディスクリプタの例を示します。DTDについては、前のセクションの「キャッシュ・ポリシー・ディスクリプタDTD」を参照してください。


<!--
test-policy.cpd
-->

<cachePolicy scope="application">
<expirationPolicy expirationType="TTL" TTL="25" timeInaDay="00:10:00"
writeThrough="true" />
</cachePolicy>

キャッシュ・ポリシー・ディスクリプタのロードとリフレッシュ

XMLキャッシュ・ポリシー・ディスクリプタ・ファイルからCachePolicyオブジェクトを作成するには、oracle.jsp.jwcache.CacheClientUtilクラスの静的lookupPolicy()メソッドのコールが必要です。JSPページの場合、これは自動的に処理されます。サーブレットの場合は、コードにlookupPolicy()コールをインクルードする必要があります。詳細は、「Web Object Cache APIを使用したサンプル・サーブレット」を参照してください。

キャッシング・ポリシーが以前にロードされていない場合、lookupPolicy()メソッドでは、XMLディスクリプタを解析し、それを使用して新規CachePolicyオブジェクト(およびこのオブジェクトのExpirationPolicy属性)を構成します。lookupPolicy()メソッドの詳細は、「キャッシュ・ポリシー・オブジェクトの作成」を参照してください。

CachePolicyオブジェクトは、アプリケーションに関連付けられているServletContextオブジェクトの下に間接的に格納されます。同一のキャッシング・ポリシーを再度リクエストすると、格納されているポリシー・オブジェクトが、ディスクリプタを再読込みまたは再解析することなく戻されます。パフォーマンス上の理由に加えて、セキュリティ上の理由から、キャッシュ・ポリシー・ディスクリプタ・ファイルはほとんど変更されないため、OC4Jには、ディスクリプタの自動再ロード機能は備わっていません。その結果、キャッシュ・ポリシー・オブジェクトは、アクセス速度を上げるため、中間層のJVMに格納されます。

CachePolicyオブジェクトは、サーブレット・コンテキストが破棄されるまで、またはCacheClientUtilクラスの静的refreshPolicy()メソッドがコールされるまで有効です。このメソッドには、lookupPolicy()メソッドと同じコール順序があります。たとえば、次のように指定します。


oracle.jsp.jwcache.CacheClientUtil.refreshPolicy
                   (servletConfig, request, "/WEB-INF/foo.cpd");

キャッシング・ポリシーを変更およびリフレッシュする場合、アクティブなキャッシュ・ブロックは影響を受けません。

キャッシュ・リポジトリ・ディスクリプタ

XMLスタイルのキャッシュ・リポジトリ・ディスクリプタを使用して、Web Object Cacheのバックエンド・キャッシュ・リポジトリとして使用するリポジトリとその構成方法を指定します。このセクションでは、キャッシュ・リポジトリ・ディスクリプタのDTDとサンプル・キャッシュ・リポジトリ・ディスクリプタを示します。


注意:

Web Object Cacheは、デフォルトでOracle9i Application Server Java Object Cacheをキャッシュ・リポジトリとして使用します。


キャッシュ・リポジトリ・ディスクリプタDTD

このセクションでは、Web Object Cacheのキャッシュ・リポジトリ・ディスクリプタDTD、wcache.dtdのリストを示します。キャッシュ・ポリシー・ディスクリプタの例は、次のセクションの「サンプル・キャッシュ・リポジトリ・ディスクリプタ」を参照してください。


<!--
Copyright 2000 Oracle Corporation
wcache.dtd
-->
<!--
This DTD is used to validate "/WEB-INF/wcache.xml", which is used to hold
web cache repositories configuration information for
Oracle programmable web caching components.
-->

<!--
The wcache-config element is the root element of web cache repositories
configuration descriptor.
-->

<!ELEMENT wcache-config (cache-repository*)>

<!ELEMENT cache-repository
(cache-repository-name,cache-repository-class,init-param*)>

<!ELEMENT cache-repository-name (#PCDATA)>
<!ELEMENT cache-repository-class (#PCDATA)>

<!ELEMENT init-param (param-name,param-value)>
<!ELEMENT param-name (#PCDATA)>
<!ELEMENT param-value (#PCDATA)>

サンプル・キャッシュ・リポジトリ・ディスクリプタ

このセクションでは、OC4Jが提供するキャッシュ・リポジトリ・ディスクリプタのリストを示します。DTDについては、前のセクションの「キャッシュ・リポジトリ・ディスクリプタDTD」を参照してください。


注意:

DTDには、reporootが含まれていません。これは、ファイル・システムのキャッシュ実装にのみ使用する特殊なパラメータです。



<wcache-config>

<cache-repository>
   <cache-repository-name>DefaultCacheRepository</cache-repository-name>
   <cache-repository-class>
      oracle.jsp.jwcache.repository.impl.OCSRepoImpl
   </cache-repository-class>
</cache-repository>

<cache-repository>
   <cache-repository-name>SimpleFSRepo</cache-repository-name>
   <cache-repository-class>
      oracle.jsp.jwcache.repository.impl.SimpleFSRepositoryImpl
   </cache-repository-class>
   <init-param>
      <param-name>reporoot</param-name>
      <param-value>/tmp/reporoot</param-value>
   </init-param>
</cache-repository>

</wcache-config>

バックエンド・リポジトリの構成

このセクションでは、OC4J Web Object Cacheのバックエンド・リポジトリとして使用するOracle9i Application Server Java Object Cacheまたはファイル・システムの構成方法について説明します。

Oracle9i Application Server Java Object Cacheの構成ノート

OC4J環境で、デフォルトのキャッシュ・リポジトリとしてOracle9i Application Server Java Object Cacheを使用するためには、次の準備手順が必要です。

  1. global-web-application.xmlを更新して、Java Object Cacheの構成ファイルOCS4J.propertiesの場所を指定する初期化パラメータを追加します。

    次に、UNIXシステムの例を示します。

    
    <servlet>
       <servlet-name>jsp</servlet-name>
       <servlet-class>oracle.jsp.runtimev2.JspServlet</servlet-class>
       <init-param>
          <param-name>ocs4j_file</param-name>
          <param-value>
             <your_install_root>/demo/ojspdemos/ojspdemos-web/WEB-INF/misc-file/OCS4J.properties
          </param-value>
       </init-param>
    </servlet>
    
    


    注意:

    • Java Object Cache cache.jarファイルは、<your_install_root>/libディレクトリで使用可能である必要があります。

    • misc-fileディレクトリは、デモ・プログラムの実行時に自動的に作成されます。


  1. 必要に応じて、OCS4J.propertiesを更新します。Java Object Cacheに対してルート・ディレクトリを設定する場合は、diskPathエントリを更新します。

    UNIXシステムの場合は、次の例のように実行します。

    
    diskPath = /mydir/ocs4jdir
    
    

    Windows NTシステムの場合は、次のように実行します(ドライブの指定が必要です)。

    
    diskPath = c:\mydir\ocs4jdir
    
    

    1. Webサーバーを再起動します。

    ファイル・システム・キャッシュの構成ノート

    ファイル・システムをバックエンド・リポジトリとして使用する場合は、キャッシュ・リポジトリ・ディスクリプタ(wcache.xml)を編集してreporootを設定し、ファイル・システム・キャッシュのルート・ディレクトリを指定します。このファイルは、OC4JサンプルがインストールされているWEB-INFディレクトリにあります。reporoot値を設定するキャッシュ・リポジトリ・ディスクリプタの詳細と例は、「キャッシュ・リポジトリ・ディスクリプタ」を参照してください。

    次に、UNIXシステムの例を示します。

    
    <init-param>
       <param-name>reporoot</param-name>
       <param-value>/mydir/repositoryroot</param-value>
    </init-param>
    
    

    次に、Windows NTシステムの例を示します。

    
    <init-param>
       <param-name>reporoot</param-name>
       <param-value>c:\mydir\repositoryroot</param-value>
    </init-param>