ヘッダーをスキップ

Oracle Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス
10g(10.1.3.1.0)

B31854-01
目次
目次
索引
索引

戻る 次へ

7 Web Object CacheのタグとAPI

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

この章には、次の項目が含まれます。

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

Web Object Cacheの概要

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

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

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

次の各項では、Web Object Cacheの概要を説明します。

Web Object Cacheの利点


注意

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


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

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

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

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

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

Web Object Cacheのコンポーネント

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

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

キャッシュ・リポジトリ

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

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

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

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

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


注意

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


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

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

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

この章では、これらのプログラミング・インタフェースとキャッシュ・リポジトリとの相互作用について説明します。キャッシュ・タグについては、「Web Object Cacheタグの説明」で説明します。基礎となるキャッシュ・ポリシーAPIについては、「Web Object Cache 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()を自動的にコールし、各キャッシュ・オブジェクトの完全な階層コピーを作成します。

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

実行時に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キャッシュ・タグの属性を使用して設定できます。サーブレットでは、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を使用します。

デフォルト: SCOPE_APP 

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パラメータは、キャッシング機能とは関係ありません。これは、おそらくmyparの値はキャッシュ可能なページ出力には関係ないと判断され、キャッシュ・ポリシー・オブジェクトのselectedParameters[]リストにこのパラメータが含まれていないためです。

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

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。timeInaDay属性に従って、1日の指定した時間に期限切れになります。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タグ・ライブラリを使用する場合は、次の要件に注意してください。

taglibディレクティブ、予約済のタグ・ライブラリ・ディレクトリ、TLDファイルおよびuri値の内容の詳細は、『Oracle Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。


注意

  • このタグ構文では、接頭辞「ojsp:」が使用されます。慣例的にこのように表記しますが、必須ではありません。任意の接頭辞をtaglibディレクティブに指定できます。

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

 

キャッシュ・タグの説明

この項では、次のタグについて説明します。

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

Web Object Cacheのcacheタグ

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


注意

XMLオブジェクトのキャッシングには、かわりにcacheXMLObjタグを使用します。Javaのシリアライズ可能オブジェクトのキャッシングには、useCacheObjタグを使用します。これらのタグは、この項で説明するcacheタグのすべての属性をサポートしています。「Web Object 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>


注意

主なデフォルト値は、TTLが300秒、dayInaMonthが10(月の10日目)、キャッシュ・リポジトリ名がDefaultCacheRepositoryです。 


属性

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

属性の使用方法

例: cacheタグ

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

<%@ taglib uri="http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/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>


注意

  • このタグは、必要に応じて、ボディなしの単一タグにすることもできます。その場合、かわりにfromXMLObjName属性を入力に使用できます。

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

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

 

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

例: 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 Oracle 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" dataSource="<%= dataSrcStr %>" />
<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>


注意

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タグとjsp:includeタグを個別に使用します。

cacheIncludeタグとJESI includeタグの間の重要な違いにも注意してください。(このタグの詳細は、「JESI includeタグ」を参照してください。)Oracle Web Cacheは、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スコープ)を次のように指定します。

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

この項では、キャッシュの無効化の簡単な例を示します。

例: invalidateCacheタグ

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

<%@ taglib uri="http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/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 APIの説明

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

次の各項ではAPIについて説明します。

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

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

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

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

lookupPolicy()メソッドの使用

通常、CachePolicyオブジェクトを作成する最も簡単な方法は、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コンストラクタの使用

CachePolicyクラスには、3つのパブリック・コンストラクタがあります。サーブレット構成オブジェクトのみを必要とする単純コンストラクタ、別の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();
}

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

CachePolicyメソッドの説明

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

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メソッド」「サーブレット・ページ: DemoCacheServlet.java」で説明します。

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

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

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

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

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

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

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

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

fragment#1  (expires in 25 seconds based on 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="http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/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 based on 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

コード・ノートは、次項の「サーブレット・ページ: DemoCacheServlet.java」のサーブレット・バージョンと同じです。

<%@ 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 based on 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

コード・ノートは、コードの末尾に説明してあります。

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 (for example, "/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属性を設定する簡単なキャッシュ・ポリシー・ディスクリプタの例を示します。

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

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

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

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

キャッシング・ポリシーが以前にロードされていない場合、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とサンプル・キャッシュ・リポジトリ・ディスクリプタを示します。

キャッシュ・リポジトリ・ディスクリプタ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には、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>

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

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

Oracle Application Server Java Object Cacheの構成上の注意

OC4Jのserver.xmlファイルでは、<javacache-config>要素でJava Object Cache構成ファイルが指定されている必要があります。これは<application-server>要素のサブ要素です。デフォルトのエントリを次に示します。

<application-server ... >
...
   <javacache-config path="../../../javacache/admin/javacache.xml" />
...
</application-server>

このデフォルト・エントリで、デフォルト構成ファイルのディレクトリ位置(server.xmlの格納場所)を想定すると、デフォルトでOC4JインスタンスはORACLE_HOME/javacache/adminディレクトリにある同じJava Object Cache構成ファイルjavacache.xmlを共有します。

次にJava Object Cache構成ファイルの例を示します。

<?xml version="1.0" encoding="UTF-8"?>
<cache-configuration
 xmlns="http://www.oracle.com/oracle/ias/cache/configuration"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
   <logging>
     <location>javacache.log</location>
     <level>ERROR</level>
   </logging>
   <communication>
     <isDistributed>true</isDistributed>
     <coordinator discovery-port="7000"/>
   </communication>
   <persistence>
     <location>diskcache</location>
     <disksize>32</disksize>
   </persistence>
   <max-objects>1000</max-objects>
   <max-size>48</max-size>
   <clean-interval>30</clean-interval>
</cache-configuration>

Java Object Cache、その構成およびjavacache.xmlファイルの詳細は、『Oracle Containers for J2EEサービス・ガイド』を参照してください。server.xmlファイルの詳細は、『Oracle Application Server Containers for J2EEユーザーズ・ガイド』を参照してください。

ファイル・システム・キャッシュの構成上の注意

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

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

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

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

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

戻る 次へ
Oracle
Copyright © 2002, 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引