Oracle Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス 10g(10.1.3.1.0) B31854-01 |
|
この章では、OC4Jが提供するアプリケーション・レベルのキャッシング機能であるWeb Object Cacheについて説明します。Javaで作成されたWebアプリケーションでは、Web Object CacheをOracle Web Cacheとともに使用するとスピードとスケーラビリティが増大します。
この章には、次の項目が含まれます。
Oracle Web CacheおよびOracle Application Server Java Object Cacheの説明を含むWebキャッシングの概要は、「Webアプリケーションに対するOracleキャッシング・サポートのサマリー」を参照してください。
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は特定の使用例で有用であり、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は、Javaの認可ロジック内に埋め込まれています。
Web Object Cacheは、JSPページで使用すると特に便利です。JSPコードの生成によって、開発作業を大幅に軽減できます。
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のプログラミング・インタフェースは、次のように分割できます。
これは、サーブレットとJSPページ間の共通レイヤーで、HTTPセマンティクスとキャッシュ・ポリシーを処理します。このレイヤーは、キャッシュ・リポジトリと通信します。
これは、JSPのカスタム・タグ機能を使用した、Web Object Cache API用の便利なラッパーです。キャッシングの制御には、JSPページでカスタム・タグを使用します。この場合、APIは基礎となるタグ・ハンドラ・クラスを介してコールされます。
この章では、これらのプログラミング・インタフェースとキャッシュ・リポジトリとの相互作用について説明します。キャッシュ・タグについては、「Web Object Cacheタグの説明」で説明します。基礎となるキャッシュ・ポリシーAPIについては、「Web Object Cache APIの説明」で説明します。サーブレットでは、基礎となるAPIを使用し、JSPページでは通常、より便利なタグを使用します。
キャッシュ・ポリシーとは、キャッシュの詳細とその動作を決定する一連の仕様です。次の項目が含まれます。
キャッシュ・ポリシーの仕様(「ポリシー仕様の属性と使用」を参照)は、次のいずれかを使用して設定できます。
「Web Object Cacheタグの説明」を参照してください。
「Web Object Cache APIの説明」を参照してください。
「キャッシュ・ポリシー・ディスクリプタ」を参照してください。
キャッシュ・ポリシー・オブジェクト(oracle.jsp.jwcache.CachePolicy
クラスのインスタンス)は、これらの入力に基づいたポリシー設定を使用して作成されます。期限切れポリシーは、キャッシュ・ポリシーの一部であるため、各CachePolicy
オブジェクトには、oracle.jsp.jwcache.ExpirationPolicy
クラスのインスタンスである属性が含まれます。
キャッシュ・データは、session scope(現行のHTTPセッションに対してのみ使用可能な場合)またはapplication scope(アプリケーションの全ユーザーに対して使用可能な場合)のいずれかになります。
たとえば、口座の残高をキャッシュするオンライン銀行取引のアプリケーションを考えてみます。この情報に関心があるのは、現行のユーザーのみです。したがって、session
スコープが適切です。
一方、全ユーザーに対して同じ汎用製品を推奨する「ようこそ」ページを持つオンライン・ストアについて考えてみます。この場合のページにはapplication
スコープを持つキャッシュの使用が適切です。
次の各項では、Web Object Cacheの主要機能について説明します。
キャッシュ・ブロックは、キャッシュ・ブロック名に関連付けられています。キャッシュ・ブロック名は、キャッシング・ポリシーによって暗黙的(通常はこれを推奨)に、またはアプリケーション・コードによって明示的に決定できます。ページ取得時には、対象のページ・フラグメントの再生成を回避するために、キャッシュ・ブロック名をルックアップします。
暗黙的なネーミングの場合は、次の2つを入力します。
キャッシュ・ポリシーAPIレイヤーが、ネーミング・ロジックを実行します。
キャッシング・ロジックは、標準のJava Servlet APIから対応するセマンティクスを借用します。
ほとんどの場合、暗黙的なネーミングで指定された名前には、十分な情報が含まれています。これは、通常、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
インタフェースが備わっています。このインタフェースは、クローン化可能にする必要があるシリアライズ可能なキャッシュ・オブジェクトに実装できます。シリアライズされずに、キャッシュされた変更可能なオブジェクトに対して、クローニングは、キャッシュ・オブジェクトの完全な階層コピーを作成するのに有効です。この項では、クローニングの有用性について説明します。最初に必要なバックグラウンド情報を説明します。
Web Object Cacheのバックエンドとして使用できるリポジトリには、次の2つのカテゴリがあります。
2次記憶装置リポジトリでは、キャッシュ操作時にJavaのシリアライズが必要です。キャッシュへの格納時、オブジェクトはリポジトリにシリアライズされます。キャッシュからの取得時、そのオブジェクトはメモリーにデシリアライズされます。したがって、シリアライズとデシリアライズ処理の結果、キャッシュ・オブジェクトの完全な個別コピーが各キャッシュ操作時に自動的に作成されます。
これは、キャッシュ・オブジェクトをメモリー指向リポジトリとの間で格納または取得する場合には、当てはまりません。メモリー指向リポジトリでは、ユーザー・アプリケーション内の同一オブジェクトがキャッシュに格納されます。あるいは、キャッシュ内の同一オブジェクトがユーザーのために取得されます。デフォルトでは、コピーは作成されません。複数の取得が行われる場合は、すべての取得で同じオブジェクトが共有されます。
多くのアプリケーションでは、異なる取得ごとに、1つのキャッシュ・オブジェクトの異なるコピーを使用する場合があります。これには2つの主要な理由があります。
この問題を回避するために、汎用のJavaのシリアライズ可能データをメモリー指向リポジトリとの間で格納または取得するときは、完全な階層コピーを使用してください。「完全な階層」が意味することは、オブジェクトが参照する直接的なメンバーのみではなく、参照するすべての間接的な変数をコピーすることにあります。たとえば、オブジェクトxyz
にメンバー変数としてjava.util.Vector
インスタンスがあるとします。完全な階層コピーのクローニングでは、Vector
インスタンス自体の他に、Vector
インスタンスが参照するすべての変更可能なオブジェクトや要素のコピーが含まれます。
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
属性を設定できます。(詳細は、「キャッシュ・ポリシー・ディスクリプタ」を参照してください。)
期限切れに基づいてキャッシュを無効にするかわりに、次の方法を使用してキャッシュを明示的に無効化できます。
invalidateCache
タグを使用します。「Web Object CacheのinvalidateCacheタグ」を参照してください。
CachePolicy
インスタンスのオーバーロードされたinvalidateCache()
メソッド、invalidateCacheLike()
メソッドまたはinvalidateCacheOtherPathLike()
メソッドを使用します。「CachePolicyメソッド」を参照してください。
この項では、キャッシュ・ポリシーの属性、特にCachePolicy
クラスとExpirationPolicy
クラスの属性について説明します。これらの属性は、JSPページではカスタム・タグを使用して設定でき、サーブレットでは付属のJava APIを使用して直接設定できます。キャッシュ・ポリシー・ディスクリプタ・ファイルを使用しても設定できます。
キャッシュ・ポリシーについては、「キャッシュ・ポリシーとスコープ」で説明しています。このポリシーは、キャッシュ・ブロックの動作を決定する詳細な項目で構成されています。後続の項で説明するように、キャッシュ・ポリシーの属性は複数の方法で設定できます。
「Web Object Cacheタグの説明」を参照してください。
「CachePolicyメソッド」を参照してください。
「キャッシュ・ポリシー・ディスクリプタ」を参照してください。
キャッシュ・ポリシー設定を指定すると、結果的にキャッシュ・ポリシー・オブジェクトが作成されます。このオブジェクトには、期限切れポリシー・オブジェクトが属性の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で、キャッシュ・ポリシー・オブジェクトの属性について説明します。
属性 | 型 | 説明 |
---|---|---|
ignoreCache |
Boolean |
開発時専用の属性です。コードを頻繁に変更する場合は、この属性を
デフォルト: |
scope |
int |
キャッシュのスコープを指定します。現行のHTTPセッションのみにアクセスできるキャッシュ・ブロックには、整定数
デフォルト: |
autoType |
int |
キャッシュ・ブロックのネーミングを明示的に行うか暗黙的に行うかを指定し、暗黙的なネーミングの場合はHTTPリクエストのプロパティをキャッシュ・ブロックのネーミングで使用する方法も指定します。この名前は、後続リクエストでそのキャッシュが再利用される時点を決定するときに必要です。「キャッシュ・ブロックのネーミングとautoType属性の詳細」を参照してください。
デフォルト: 暗黙的。URIと全パラメータおよび選択したCookieに従います( |
selectedParameters[] |
String[] |
キャッシュ・ブロックのネーミングで使用するために選択したリクエスト・パラメータの名前です。
デフォルト: |
selectedCookies[] |
String[] |
キャッシュ・ブロックのネーミングで使用するために選択したCookieの名前です。
デフォルト: |
reusableTimeStamp |
java.util.Date |
キャッシュの使用可能性に対する絶対制限時間です。この制限時間より前に作成されたすべてのキャッシュ・ブロックは、再利用されません。かわりに、データが再生成されますが、キャッシュ・ブロックの変更はありません。「reusableTimeStampとreusableDeltaTimeの詳細」を参照してください。
デフォルト: 常に再利用可能 |
reusableDeltaTime |
long |
キャッシュの使用可能性に対する相対制限時間です。キャッシュ・ブロックの作成時間と現在の時間の差が
デフォルト: 常に再利用可能 |
expirationPolicy |
ExpirationPolicy |
期限切れポリシー・オブジェクト( 期限切れポリシー・オブジェクト、パラメータおよびデフォルトの詳細は、「期限切れポリシーの属性」を参照してください。 |
cacheRepositoryName |
String |
キャッシュ・リポジトリの名前です。各キャッシュ・ポリシーは、独自のリポジトリを使用できます。
キャッシュ・リポジトリの構成は、 デフォルト: 「DefaultCacheRepository」 |
reportException |
Boolean |
この属性を
デフォルト: |
「キャッシュ・ブロックのネーミング: 暗黙的なネーミングと明示的なネーミングの比較」で説明したように、キャッシュ・ブロックの名前は暗黙的(自動ネーミングとも呼ばれます)または明示的(ユーザー・ネーミングとも呼ばれます)に指定できます。
具体的には、キャッシュ・ブロックのネーミングには、6つの方法があります。最初の方法は、明示的なネーミングです。この方法は、TYPE_USERSPECIFIED
(整定数)のautoType
設定によって指定します。
他の5つの方法は、暗黙的なネーミングのバリエーションです。
TYPE_URI_ONLY
のautoType
設定によって指定します。
リクエストURI + 問合せ文字列 + 選択したCookie
TYPE_URI_QUERYSTR
のautoType
設定によって指定します。selectedCookies[]
属性にCookieを指定します。
リクエストURI + すべてのパラメータ + 選択したCookie(デフォルト)
TYPE_URI_ALLPARAM
のautoType
設定によって指定します。selectedCookies[]
属性にCookieを指定します。
リクエストURI + 選択したパラメータ + 選択したCookie
TYPE_URI_SELECTEDPARAM
のautoType
設定によって指定します。パラメータをselectedParameters[]
属性に、CookieをselectedCookies[]
属性に指定します。
リクエストURI + 除外したパラメータ以外の全パラメータ + 選択したCookie
TYPE_URI_EXCLUDEDPARAM
のautoType
設定によって指定します。CookieをselectedCookies[]
属性に、除外したパラメータをselectedParameters[]
属性に指定します。
たとえば、各ユーザー用にパーソナライズした挨拶文を含む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のカスタマイズ情報が再生成されることなく表示されます。yourpar
、hello
およびfoo
の各パラメータは、キャッシング機能には無関係です。これは、キャッシュ・ポリシー・オブジェクトのselectedParameters[]
リストにこれらのパラメータが含まれていないためです。
再利用可能の概念は、TTLの概念とは異なり、より細かい制御を目的としていることに注意してください。TTLは、キャッシュの一般的な存続期間を制御します。詳細は、「期限切れポリシーの属性」を参照してください。通常、キャッシュ内のデータの使用を適切に制限するにはTTLのみ必要です。
再利用可能性に関する属性には、reusableTimeStamp
とreusableDeltaTime
があります。これらは、より特定した使用を目的としており、キャッシュ内のデータの期限切れまたは無効化には影響を与えません。たとえば、Webレポートの更新に対する要件がユーザーによって異なる状況を考えてみます。多くのユーザーが過去の任意の時間に作成されたレポートを受け入れることができる状況で、すべてのユーザーが同じバージョンを見て内容を比較しようと考えているとします。この場合、適切なTTL
値は、「1日」です。
また、データの時間によって影響を受ける小グループの特権ユーザーがいると仮定します。このユーザー・グループには、1時間以内の情報が必要であるとします。
この場合、TTL
は、すべてのユーザーに対して「1日」に設定されていますが、特権ユーザーに対しては「1時間」のreusableDeltaTime
設定が可能です。この設定によって、データが1時間を経過した場合、このキャッシュは特権ユーザーに対しては使用されなくなります。ただし、reusableTimeStamp
とreusableDeltaTime
によりキャッシュが期限切れになったり、その他の影響を受けることはありません。キャッシュ内のデータは、特権ユーザー以外のユーザーに対しては、TTLに従ってそのまま使用できます。
特権ユーザー・グループに対する、reusableTimeStamp
とreusableDeltaTime
への値の設定は、アプリケーション・ロジックに依存します。
期限切れポリシーの概要は、「データの無効化と期限切れ」で説明しています。期限切れポリシーには、キャッシュ・ブロックの期限切れ時点、そのデータが使用不可になる時点およびデータの再生成が必要な時点を決定する詳細が含まれています。(ほとんどの説明で、期限切れポリシーはキャッシュ・ポリシーの一部として考えることができます。)ExpirationPolicy
属性は、CachePolicy
属性と同様に、次のいずれかの方法で設定できます。
「Web Object Cacheタグの説明」を参照してください。
「ExpirationPolicyメソッド」を参照してください。
「キャッシュ・ポリシー・ディスクリプタ」を参照してください。
次の短縮コードは、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タグ」を参照してください。 |
OC4Jが提供するカスタム・タグを使用して、JSPページから、キャッシュ・ポリシーの設定、期限切れポリシーの設定および明示的な無効化などを指定できます。次の各項では各タグについて説明します。
Web Object Cacheタグ・ライブラリを使用する場合は、次の要件に注意してください。
ojsputil.jar
ファイル内にあります。このファイルは、予約済のタグ・ライブラリ・ディレクトリにあります。このファイルがインストール済で、クラスパスに存在していることを確認してください。
cache.jar
ファイルがインストール済で、クラスパスに存在している必要があります。このファイルもOC4Jに同梱されています。OC4J 9.0.4実装では、cache.jar
はoc4j.jar
のマニフェスト・クラスパスに示されます。Web Object Cacheタグ・ライブラリがOC4Jによってロードされる場合、ユーザー側操作は不要です。
jwcache.tld
が、アプリケーションで使用可能である必要があります。また、ライブラリを使用するJSPページには、適切なtaglib
ディレクティブが存在する必要があります。Oracle Application Serverのインストール時、TLDはojsputil.jar
に配置されます。jwcache.tld
のuri
値は次のとおりです。
http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/jwcache.tld
taglib
ディレクティブ、予約済のタグ・ライブラリ・ディレクトリ、TLDファイルおよびuri
値の内容の詳細は、『Oracle Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。
注意
|
この項では、次のタグについて説明します。
cache
一般的な文字ベースのキャッシング(HTMLまたはXMLのフラグメント)に使用します。
cacheXMLObj
XMLオブジェクトのキャッシングに使用します。このオブジェクトのパラメータは、cache
タグ・パラメータのスーパーセットを構成します。Web Object CacheはXML文書の後処理時に特に便利なため、cacheXMLObj
タグは、cache
タグより頻繁に使用される可能性があります。
useCacheObj
Javaのシリアライズ可能オブジェクトの一般的なキャッシングに使用します。一部のセマンティクスと構文は、標準のjsp:useBean
タグに従ってパターン化されています。
cacheInclude
cache
タグの機能と標準のjsp:include
タグの機能を結合します。
この項では、キャッシュ・タグ内でのコードの条件付き実行によって発生する可能性がある問題、およびこの問題の回避策として、キャッシュ・ブロックを個別JSPページに分割し、必要に応じてcacheInclude
タグを使用してページを適切に結合する方法についても説明します。
この項では、cache
タグの構文と属性について説明します。このタグを使用すると、XMLオブジェクトやJavaのシリアライズ可能オブジェクトのキャッシングとは異なり、JSPアプリケーションで一般的なキャッシングを設定できます。
注意
XMLオブジェクトのキャッシングには、かわりに |
<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>
cache
タグのパラメータのほとんどは、この章の前半で説明したCachePolicy
クラスまたはExpirationPolicy
クラスの属性に対応しています(以降に参照先を示しています)。
policy
: 必要に応じて、キャッシュ・ポリシー・ディスクリプタを指定します。このディスクリプタの設定がキャッシュ・ポリシーの定義に使用されます。キャッシュ・ポリシー・ディスクリプタは、個別のキャッシュ・タグ属性の設定のかわりに使用できます。または、タグ属性の設定によってオーバーライドできるデフォルト値を設定できます。JSPアプリケーション相対URL構文に従ってディスクリプタ・ファイル名を指定します。アプリケーション相対URL構文の詳細は、『Oracle Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。
次に、キャッシュ・ポリシー・ディスクリプタの簡単な例を示します。
<!-- test-policy.cpd --> <cachePolicy scope="application"> <expirationPolicy expirationType="TTL" TTL="25" timeInaDay="00:10:00" writeThrough="true" /> </cachePolicy>
詳細は、「キャッシュ・ポリシー・ディスクリプタ」を参照してください。
ignoreCache
: 「キャッシュ・ポリシーの属性」を参照してください。
invalidateCache
: 最初に無効化するキャッシュ・ブロックに対応しているキャッシュ・ブロック(同じ名前を持つ既存の任意のキャッシュ・ブロック)に対して、このフラグを有効にします。これは、暗黙的なキャッシュ・ブロックのネーミングを使用している場合は特に便利です。ただし、明示的な名前にも使用できます。その場合は、cache
タグのname
属性にキャッシュ・ブロック名を指定します。デフォルト設定は「false
」です。
この属性を汎用的な
注意
invalidateCache
タグと混同しないでください。「Web Object CacheのinvalidateCacheタグ」を参照してください。invalidateCache
属性は、個別のキャッシュ・ブロックの無効化に使用する特殊なまたは拡張された属性です。
scope
: 「キャッシュ・ポリシーの属性」を参照してください。
autoType
: 「キャッシュ・ポリシーの属性」を参照してください。タグ属性の設定値とクラス属性値(整定数)の対応関係は、次のとおりです。
selectedParam
: 「キャッシュ・ポリシーの属性」を参照してください。
selectedCookies
: 「キャッシュ・ポリシーの属性」を参照してください。
reusableTimeStamp
: 「キャッシュ・ポリシーの属性」を参照してください。
reusableDeltaTime
: 「キャッシュ・ポリシーの属性」を参照してください。
name
: 明示的なキャッシュ・ブロックのネーミングを使用する場合は、name
パラメータを使用してブロック名を指定します。
expirationType
: 「期限切れポリシーの属性」を参照してください。
TTL
: 「期限切れポリシーの属性」を参照してください。
timeInaDay
: 「期限切れポリシーの属性」を参照してください。
dayInaWeek
: 「期限切れポリシーの属性」を参照してください。
dayInaMonth
: 「期限切れポリシーの属性」を参照してください。
writeThrough
: 「期限切れポリシーの属性」を参照してください。
printCacheBlockInfo
(デバッグ用): このパラメータを有効にすると、キャッシュ・ブロックの内部キャッシュ名、作成時間および期限切れ時期がHTML/XMLコメント構成メンバー内に出力されます。デフォルト設定は「false
」です。
printCachePolicy
(デバッグ用): このパラメータを有効にすると、このキャッシュ・ブロックのすべてのキャッシュ・ポリシー属性の値がHTML/XMLコメント構成メンバー内に出力されます。デフォルト設定は「false
」です。
cacheRepositoryName
: 「キャッシュ・ポリシーの属性」を参照してください。
reportException
: 「キャッシュ・ポリシーの属性」を参照してください。
name
属性は、autoType
がuser
に設定されている場合のみ必要です。
selectedParam
属性は、autoType
がURI_selectedParam
またはURI_excludedParam
に設定されている場合のみ必要です。
selectedCookies
属性は、autoType
がuser
またはURI
に設定されている場合は必要ありません。
timeInaDay
属性は、expirationType
がTTL
に設定されている場合は必要ありません。
dayInaWeek
属性は、expirationType
がweekly
に設定されている場合のみ必要です。
dayInaMonth
属性は、expirationType
がmonthly
に設定されている場合のみ必要です。
次の例では、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>
通常、XML DOMオブジェクトをキャッシュする場合は、cache
タグではなく、cacheXMLObj
を使用します。
cacheXMLObj
タグは、「Web Object Cacheのcacheタグ」で説明したcache
タグのすべての属性、およびこの項で説明する属性をサポートしています。
<ojsp:cacheXMLObj ... [ fromXMLObjName = "objectname" ] [ toXMLObjName = "objectname" ] [ toWriter = "true" | "false" ] > [...Code for cache block...] </ojsp:cacheXMLObj>
注意
|
fromXMLObjName
: 明示的な受渡しの場合は、(pageContext
オブジェクトから)キャッシュに渡すXML入力オブジェクトの名前を指定します。
toXMLObjName
: 明示的な受渡しの場合は、キャッシュから(pageContext
オブジェクトに)渡すXML出力オブジェクトの名前を指定します。
toWriter
: XMLオブジェクトをJSPライターに書き込み、ユーザーのブラウザに直接出力する場合は、「true
」に設定します。デフォルト値は「false
」です。
注意
cacheXMLObj
タグは、OC4Jが提供する複数のカスタム・タグの1つで、XMLに関連したタグです。これらのタグは、場合により(あるいは常に)、XMLオブジェクトを入力として取得したり、出力として作成します。この他に、この種のタグには、SQLライブラリのdbQuery
タグ(問合せ結果をXML DOMオブジェクトとして出力できます)およびXMLライブラリのtransform
タグとstyleSheet
タグ(XMLオブジェクトを入力として取得し、XSLT変換を使用して別のXMLオブジェクトまたはJSP Writerを出力として作成できます)があります。これらのタグは、XMLデータの明示的な受渡し用にfromXMLObjName
属性とtoXMLObjName
属性を持つことで一致しています。詳細は、「XMLプロデューサとXMLコンシューマ」を参照してください。
この例では、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>
シリアライズ可能なすべてのJavaオブジェクトをキャッシュするには、useCacheObj
タグを使用します。
useCacheObj
タグは、「Web Object Cacheのcacheタグ」で説明したcache
タグのすべての属性、およびこの項で説明する属性をサポートしています。
<ojsp:useCacheObj ... type="classname" id = "instancename" [ cacheScope = "application" | "session" ] > ...Code for cache block... </ojsp:useCacheObj>
type
(必須): キャッシュするJavaオブジェクトのクラス名を指定します。
id
(必須): キャッシュするJavaオブジェクトのインスタンス名を指定します。
cacheScope
: この属性の使用方法は、cache
タグとcacheXMLObj
タグのscope
属性と同じです。「キャッシュ・ポリシーの属性」を参照してください。
この項で説明するtype
属性とid
属性は、jsp:useBean
タグのtype
(またはclass
)属性とid
属性と同じように使用されます。
<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
、cacheXMLObj
またはuseCacheObj
)内のコードは条件付きで実行されます。特に次のような場合が該当します。
次に例を示します。
<% String str=null; %> <% ojsp:useCacheObj ... > <% str = "abc"; //...more Java code...%> </ojsp:useCacheObj> <% out.print(str.length()); // May cause null pointer exception
このキャッシュが使用可能で再利用される場合、文字列str
を適切に初期化するコードは実行されません。
次に例を示します。
<ojsp:useCacheObj ... > <% String str = "abc"; //...more Java code...%> </ojsp:useCacheObj> <% // String str will not be available here %>
cache
タグ(cacheXMLObj
やuseCacheObj
ではなく)を使用している場合は、キャッシュ・ブロックを個別のJSPページに分割することによって、この種の状況に陥る可能性が少なくなります。この場合、各キャッシュ・ブロックは、独自のURIで表します。必要に応じて動的インクルード機能を使用すると、これらのページを結合できます。
この操作をさらに簡単にするために、OracleはcacheInclude
タグを用意しています。次項の「Web Object CacheのcacheIncludeタグ」で説明します。
cacheInclude
タグは、cache
タグ(ただし、cacheXMLObj
タグやuseCacheObj
タグを除く)の機能と標準のjsp:include
タグの機能を結合します。
キャッシュ・ブロックの個別ページへの配置およびcacheInclude
タグの使用は、モジュール性や透明性、さらに前述の「Cacheタグ内でのコードの条件付き実行」で説明した問題などを考慮すると、多くのメリットがあります。
ただし、次の制限事項に注意してください。
cacheInclude
タグには、ランタイムのJSP式は使用できません。
jsp:include
タグとは異なりflush
パラメータはありません。
これらの制限が問題になる場合は、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>
policy
(必須): キャッシュ・ポリシー・ディスクリプタ・ファイルを使用して、キャッシュ・ポリシーの設定を指定する必要があります。個別のパラメータ設定はサポートされていません。
page
(必須): このpage
属性を使用して、動的にインクルードするページのURIを指定します。標準のjsp:include
タグと同じです。
printCacheBlockInfo
(デバッグ用): 「Web Object Cacheのcacheタグ」を参照してください。
reportException
: 「キャッシュ・ポリシーの属性」を参照してください。
次の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
タグの使用方法を説明します。
キャッシュ・ブロックをプログラム・ロジックを使用して明示的に無効化する場合は、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" ] />
invalidateCache
タグのほとんどのパラメータは、cache
タグおよびcacheXMLObj
タグにも存在し、同じように使用されます。詳細は、この章で前述しています(以降に参照先を示しています)。
policy
: 「Web Object Cacheのcacheタグ」を参照してください。
ignoreCache
: 「キャッシュ・ポリシーの属性」を参照してください。
scope
: 「キャッシュ・ポリシーの属性」を参照してください。
autoType
: 「キャッシュ・ポリシーの属性」を参照してください。タグ属性の設定値とクラス属性値(整定数)の対応関係は、次のとおりです。
selectedParam
: 「キャッシュ・ポリシーの属性」を参照してください。
selectedCookies
: 「キャッシュ・ポリシーの属性」を参照してください。
name
: 明示的なキャッシュ・ブロックのネーミングによって名前を指定された1つ以上のキャッシュ・ブロックを無効化するには、後述の「nameとinvalidateNameLikeの使用」の指示に従って、この属性をinvalidateNameLike
とともに使用します。
invalidateNameLike
: 明示的なキャッシュ・ブロックのネーミングによって名前を指定された1つ以上のキャッシュ・ブロックを無効化するには、後述の「nameとinvalidateNameLikeの使用」の指示に従って、この属性をname
とともに使用します。デフォルト設定は「false
」です。
page
: ページ相対URIまたはアプリケーション相対URIを指定します。暗黙的なキャッシュ・ブロックのネーミングによって名前を指定された1つ以上のキャッシュ・ブロックを無効化するには、後述の「pageとautoInvalidateLevelの使用」の指示に従って、この属性をautoInvalidateLevel
とともに使用します。
autoInvalidateLevel
: 暗黙的なキャッシュ・ブロックのネーミングによって名前を指定された1つ以上のキャッシュ・ブロックを無効化するには、後述の「pageとautoInvalidateLevelの使用」の指示に従って、この属性をpage
とともに使用します。
cacheRepositoryName
: 「キャッシュ・ポリシーの属性」を参照してください。
reportException
: 「キャッシュ・ポリシーの属性」を参照してください。
明示的なキャッシュ・ブロックのネーミングによって名前を指定した1つ以上のキャッシュ・ブロックを無効化するには、name
属性とinvalidateNameLike
属性を次のように併用します。
invalidateNameLike="false"
の場合は、name
パラメータを使用して、無効化する単一キャッシュ・ブロックの名前を指定します。
invalidateNameLike="true"
の場合で、基礎となるキャッシュ・リポジトリがワイルド・カード文字をサポートしている場合は、ワイルド・カード文字「*」をname
パラメータに使用すると、その基準に適合した名前を持つ複数のキャッシュ・ブロックを無効化できます。(Oracle Application Server Java Object Cacheでは、現在ワイルド・カード文字をサポートしていません。)
暗黙的なキャッシュ・ブロックのネーミングによって名前を指定した1つ以上のキャッシュ・ブロックを無効化するには、page
属性とautoInvalidateLevel
属性を併用します。
page
属性を使用して、Webページの適切なURIを指定します。暗黙的なネーミングでは、キャッシュ・ブロック名は、WebページのURIに基づいています。
autoInvalidateLevel
を使用して無効化のスコープ(application
スコープ、page
スコープ、parameter
スコープまたはcookie
スコープ)を次のように指定します。
autoInvalidateLevel="application"
の場合は、そのページが属しているアプリケーションに関連付けられているすべてのキャッシュ・ブロックが無効化されます。たとえば、アプリケーションが/mycontext
コンテキスト・パスの下にあり、autoInvalidateLevel="application"
の場合は、http://
host
:
port
/mycontext
の下にあるすべてのページのキャッシュ・エントリが無効化されます。
次に対応する使用例を示します。
<ojsp:invalidateCache page="/" autoInvalidateLevel="application" />
autoInvalidateLevel="page"
の場合は、そのページに関連付けられているすべてのキャッシュ・ブロックのエントリが無効化されます。次に例を示します。
http://host:port/mycontext/mypage01.jsp?foo=bar
このリクエストでautoInvalidate="page"
の場合、mypage01.jsp
のキャッシュ・エントリは、関連付けられているリクエスト・パラメータとCookieに関係なく、すべて無効化されます。この中には、次の例のように関連付けられたキャッシュ・ブロックも含まれます。
http://host:port/mycontext/mypage01.jsp?p1=v1
次に対応する使用例を示します。
<ojsp:invalidateCache page="/mypage01.jsp" autoInvalidateLevel="page" />
autoInvalidateLevel="param"
の場合、同一の選択済パラメータ名とその値を含むページのキャッシュ・エントリが、関連付けられているCookieに関係なく、すべて無効化されます。次の例を考えてみます。
<ojsp:invalidateCache policy="/WEB-INF/c1.cpd" page="/mypage01.jsp?foo=bar" autoInvalidateLevel="param" />
この場合、次の例のように関連付けられているキャッシュ・ブロックは、無効化されません。
http://host:port/mycontext/mypage01.jsp?foo=bar2
ただし、次の例のように関連付けられているキャッシュ・ブロックは、関連付けられているCookieに関係なく、無効化されます。
http://host:port/mycontext/mypage01.jsp?foo=bar
続いて、次の例を考えてみます。
http://host:port/mycontext/mypage01.jsp?foo=bar&p1=v1
このリクエストに関連付けられたキャッシュ・ブロックは、c1.cpd
にfoo
HTTPリクエスト・パラメータのみが選択され、キャッシュ・ブロックが同一のキャッシュ・ポリシーc1.cpd
に格納されている場合、無効化されます。ただし、このキャッシュ・ブロックがc1.cpd
に格納されていない場合、またはc1.cpd
にp1
パラメータも選択されている場合は、無効化されません。
autoInvalidateLevel="cookie"
の場合、無効化されるのは、同一ページ、同一の選択済パラメータと値、および同一Cookieに関連付けられているキャッシュ・エントリのみです。この項では、キャッシュの無効化の簡単な例を示します。
次のページでは、以前にキャッシュされた項目リストに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>
サーブレットから、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つのアプローチがあります。
通常、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
クラスには、3つのパブリック・コンストラクタがあります。サーブレット構成オブジェクトのみを必要とする単純コンストラクタ、別のCachePolicy
オブジェクトをコピーする「copy」コンストラクタおよび特定のサーブレット構成オブジェクトを含む「copy」コンストラクタです。
public CachePolicy(javax.servlet.ServletConfig config) public CachePolicy(CachePolicy cPolicy) public CachePolicy(javax.servlet.ServletConfig config, CachePolicy cPolicy)
CachePolicy
オブジェクトでは、複数のユーティリティ・メソッドおよび主要属性のgetterメソッドとsetterメソッドを使用できます。
次の短縮コードには、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(); }
これらのメソッドでは、次の複数の共通パラメータが使用されています。
req
、javax.servlet.http.HttpServletRequest
インスタンスこれは、現行のHTTPリクエスト・オブジェクトです。
newCookies
、javax.servlet.http.Cookie[]
配列これは、新規Cookieの配列です。新規Cookieを渡すと、それらのCookieは、otherPath
パラメータを使用するキャッシュ操作(putAutoCacheForOtherPath()
メソッドなど)で使用されます。その場合は、キャッシュ・ポリシーがいくつかのCookieを選択し、無効化がCookieレベルで行われることが前提となります。新規Cookieを渡さない場合は、現行のHTTPリクエストのCookieがかわりに使用されます。
specifiedName
、Java文字列明示的なキャッシュ・ブロックのネーミングでは、これはブロック名を指します。つまり、新規キャッシュ・ブロックを作成している場合は任意のキャッシュ・ブロック名、既存のキャッシュ・ブロックを取得している場合はその既存キャッシュ・ブロックの名前です。
sectionId
、oracle.jsp.jwcache.SectionId
インスタンス(具体的には、StringSectionId
またはNumberSectionId
インスタンス)暗黙的なキャッシュ・ブロックのネーミングの場合、これはキャッシュ・ブロックの追跡に使用されるカウンタです。JSPページでは、JSPキャッシュ・タグ・ハンドラによって使用、増分およびメンテナンスされます。JSP pageContext
オブジェクトに格納されます。
SectionId
は、2つのクラス(StringSectionId
とNumberSectionId
)によって実装されるインタフェースです。StringSectionId
をメソッド・シグネチャに指定する場合は、そのクラスのインスタンスを使用する必要があります。SectionId
を指定する場合は、どちらのクラスのインスタンスも使用できます。ただし、通常は、StringSectionId
を使用してください。NumberSectionId
クラスは、主としてJSPタグ・ハンドラが使用する目的で作成されています。
サーブレットでは、セクションIDインスタンスを手動で作成する必要があります。StringSectionId
インスタンスの使用については、「サーブレット・ページ: DemoCacheServlet.java」で詳しく説明します。
otherPath
、Java文字列格納、取得または無効化の対象となる関連付けられたキャッシュ・ブロックを持つ別のJSPページのURIです。
autoInvalidateLevel
、整数暗黙的なキャッシュ・ブロックのネーミングで使用すると、無効化レベル(application
、page
、parameter
またはcookie
)を指定できます。CachePolicy
整定数のAUTO_INVALIDATE_APP_LEVEL
、AUTO_INVALIDATE_PAGE_LEVEL
、AUTO_INVALIDATE_PARAM_LEVEL
またはAUTO_INVALIDATE_COOKIE_LEVEL
を使用します。
CachePolicy
メソッドは、次のように機能します。
isRecent()
このメソッドは、指定したキャッシュ・ブロックのタイムスタンプをチェックし、その内容が再利用可能か判断します。判断材料として現行の時間とキャッシュ・ポリシーのreusableTimeStamp
属性とreusableDeltaTime
属性に値を使用します。
putCache(...)
このメソッドを使用してオブジェクトをキャッシュ・リポジトリに配置します。data
パラメータは、これ以上の変更が不要である、キャッシュ対象のシリアライズ可能なJavaオブジェクトです。JSPページでは、JSP cache
タグ・ハンドラがputCache()
をコールして、BodyContent
インスタンスをキャッシュします。cacheXMLObj
タグ・ハンドラは、このメソッドをコールして、XML DOMオブジェクトをキャッシュします。サーブレットまたはuseCacheObj
タグでは、キャッシュのターゲット・オブジェクトは、任意のJavaのシリアライズ可能オブジェクトとなります。
HTTPリクエスト・オブジェクトとキャッシュ・ブロック名(明示的なネーミングの場合)、またはセクションID(暗黙的なネーミングの場合)も指定する必要があります。
putAutoCacheForOtherPath(...)
指定した文字列ベースのセクションIDとページ・パスに基づき、(指定したCookieも必要に応じて使用して)指定のオブジェクトをキャッシュ・リポジトリに配置します。HttpServletRequest
オブジェクトも入力する必要があります。キャッシュ・ポリシーには、明示的なネーミングは使用できません(つまり、autoType=TYPE_USERSPECIFIED
を指定できません)。
getCache(...)
このメソッドを使用して、リポジトリからキャッシュ内の項目を、CacheBlock
インスタンスの形式で取得します。キャッシュ・ブロック名(明示的なネーミングの場合)またはセクションID(暗黙的なネーミングの場合)を指定できます。HTTPリクエスト・オブジェクトも入力する必要があります。
getAutoCacheForOtherPath(...)
指定した文字列ベースのセクションIDとページ・パスに基づき、(指定したCookieも必要に応じて使用して)キャッシュ内の項目をリポジトリから取得します。HttpServletRequest
オブジェクトも入力する必要があります。キャッシュ・ポリシーに明示的なネーミングを使用すると、例外が発生します。(つまり、autoType=TYPE_USERSPECIFIED
は指定できません。)
invalidateCache(...)
このメソッドを使用して、単一のキャッシュ・ブロックを無効化します。無効化は、HTTPリクエスト・オブジェクトと指定したキャッシュ・ブロック名(明示的なネーミングの場合)またはセクションID(暗黙的なネーミングの場合)に基づいて行われます。
invalidateCacheLike(...)
このメソッドを使用して、複数のキャッシュ・ブロックを無効化します。明示的なキャッシュ・ブロックのネーミングを使用し、キャッシュ・リポジトリがワイルド・カードのネーミングをサポートしている場合は、specifiedName
パラメータをワイルド・カード文字「*」付きで入力できます。Oracle Application Server Java Object Cacheでは、現在ワイルド・カード文字をサポートしていません。
暗黙的なキャッシュ・ブロックのネーミングを使用する場合は、autoInvalidateLevel
パラメータを指定して、HttpServletRequest
オブジェクトとオプションのspecifiedName
パラメータを組み合せ、無効化するキャッシュ・ブロックを決定する必要があります。autoInvalidateLevel
パラメータには、「Web Object CacheのinvalidateCacheタグ」で説明したように、JSP invalidateCache
タグと同じ機能があります(つまり、invalidateCache
タグのpage
パラメータからの情報ではなく、リクエスト・オブジェクトからの情報を使用します)。
invalidateCacheOtherPathLike(...)
このメソッドを使用して、otherPath
パラメータに指定したURIに関連付けられているキャッシュ・ブロックを無効化します。リクエスト・オブジェクトとURIのみを取得するシグネチャでは、autoInvalidateLevel
パラメータが、URIに基づいて自動的に設定されます。URIに疑問符(?
)がある場合はparam
レベル、それ以外の場合はpage
レベルに設定されます。
このメソッドの詳細シグネチャによって、autoInvalidateLevel
の設定と無効化に使用するCookieを明示的に制御できます。
getCurrentTime()
このキャッシュ・ポリシーに指定されている基礎となるキャッシュ・リポジトリの現行の時間値をjava.util.Date
インスタンスとして取得します。
次のメソッドを使用すると、CachePolicy
オブジェクトの属性を取得または変更できます。これらの属性の説明は、「キャッシュ・ポリシーの属性」を参照してください。
boolean getIgnoreCache()
void setIgnoreCache(boolean ignoreCache)
void setIgnoreCache(String ignoreCacheStr)
int getScope()
void setScope(int scope)
scope
の値には、整定数のSCOPE_APP
とSCOPE_SESSION
を使用します。
int getAutoType()
void setAutoType(int autoType)
autoType
の値には、整定数のTYPE_USERSPECIFIED
、TYPE_URI_ONLY
、TYPE_URI_QUERYSTR
、TYPE_URI_ALLPARAM
、TYPE_URI_SELECTEDPARAM
およびTYPE_URI_EXCLUDEDPARAM
を使用します。
String[] getSelectedParam()
void setSelectedParam(String[] selectedParameters)
void setSelectedParam(String selectedParamStr)
String[] getSelectedCookies()
void setSelectedCookies(String[] selectedCookies)
void setSelectedCookies(String selectedCookiesStr)
Date getReusableTimeStamp()
void setReusableTimeStamp(Date reusableTimeStamp)
void setReusableTimeStamp(long reusableTimeStamp)
reusableTimeStamp
の値で、整定数のREUSABLE_ALWAYS
は、そのキャッシュが常に再利用可能であることを示します。
long getReusableDeltaTime()
void setReusableDeltaTime(long reusableDeltaTime)
reusableDeltaTime
の値で、整定数REUSABLE_ALWAYS
は、そのキャッシュが常に再利用可能であることを示します。
ExpirationPolicy getExpirationPolicy()
void setExpirationPolicy(ExpirationPolicy
expirationPolicy)
String getCacheRepositoryName()
void setCacheRepositoryName(String repoName)
boolean getReportException()
void setReportException (boolean reportException)
void setReportException (String reportExceptionStr)
次のメソッドも使用可能です。ただし、主にWeb Object Cacheタグ・ハンドラによって使用されます。
void setScope(String scopeStr)
scope
の値には、文字列定数のSCOPE_APP_STR
とSCOPE_SESSION_STR
があります。
void setAutoType(String autoTypeStr)
void setReusableTimeStamp(String reusableTimeStampStr)
reusableTimeStamp
の値で、文字列定数REUSABLE_IGNORED
は、そのキャッシュが常に再利用可能であることを示します。
void setReusableDeltaTime(String reusableDeltaTimeStr)
reusableDeltaTime
の値で、文字列定数REUSABLE_IGNORED
は、そのキャッシュが常に再利用可能であることを示します。
各CachePolicy
オブジェクトには、ExpirationPolicy
属性があります。キャッシュ・ブロックに期限切れポリシーを設定する場合は、CachePolicy
オブジェクトのgetExpirationPolicy()
メソッドを使用できます。次に例を示します。
CachePolicy cachePolicyObj = CacheClientUtil.lookupPolicy (config, request, "/WEB-INF/mypolicy.cpd"); ExpirationPolicy expPolicyObj = cachePolicyObj.getExpirationPolicy();
ExpirationPolicy
クラスの属性には、次のgetterメソッドとsetterメソッドがあります。これらの属性の説明は、「期限切れポリシーの属性」を参照してください。
int getExpirationType()
void setExpirationType(int expirationType)
void setExpirationType(String expirationTypeStr)
long getTTL()
void setTTL(long ttl)
long getTimeInaDay()
void setTimeInaDay(long timeInaDay)
void setTimeInaDay(String timeInaDayStr)
int getDayInaWeek()
void setDayInaWeek(int dayInaWeek)
void setDayInaWeek(String dayInaWeekStr)
int getDayInaMonth()
void setDayInaMonth(int dayInaMonth)
boolean getWriteThrough()
void setWriteThrough(boolean writeThrough)
void setWriteThrough(String writeThroughStr)
さらに、ExpirationPolicy
クラスには、次のユーティリティ・メソッドがあります。
long getExpirationTime(long createTime)
たとえば、キャッシュ・ブロックの作成時間が1970年1月1日午前0時を基点としたミリ秒で表される場合、このメソッドが計算して戻す期限切れ時間も、1970年1月1日午前0時を基点としたミリ秒で表されます。つまり、期限切れのタイムスタンプは、期限切れポリシーに従います。
ExpirationPolicy
クラスは、expirationType
属性に対して、次の整定数を定義します。
次の整定数は、dayInaWeek
属性に対して定義されます。
WEEKLY_SUNDAY
WEEKLY_MONDAY
WEEKLY_TUESDAY
WEEKLY_WEDNESDAY
WEEKLY_THURSDAY
WEEKLY_FRIDAY
WEEKLY_SATURDAY
CachePolicy
オブジェクトのgetCache()
メソッドを使用すると、関連するCacheBlock
オブジェクトを取得できます。詳細は、「CachePolicyメソッド」と「サーブレット・ページ: DemoCacheServlet.java」で説明します。
次の短縮コードは、oracle.jsp.jwcache.CacheBlock
クラスの主要メソッドを示しています。ただし、このコードは説明用のコードです。
class CacheBlock { long getCreationTime(); long getExpirationTime(); Serializable getData(); }
次に、これらのメソッドを簡単に説明します。
getCreationTime()
: キャッシュ・ブロックの作成時間を示すタイムスタンプを戻します。
getExpirationTime()
: キャッシュ・ブロックの期限切れ時間を示すタイムスタンプを戻します。
getData()
: キャッシュ・ブロック・データを戻します。 次の例では、2つのキャッシュ・フラグメントからタイムスタンプ出力をキャッシュし、表示するアプリケーションに対する3つのアプローチのコードを示します。
tagcode.jsp
は、Oracle Web Object Cacheのタグを使用する簡単なJSPページです。
servletcode.jsp
は、Web Object Cacheタグを使用するかわりにJavaスクリプトレット内でWeb Object Cache APIを使用するより複雑なJSPページです。
DemoCacheServlet.java
は、サーブレット内でWeb Object Cache APIを使用します。
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
<%@ 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>
コード・ノートは、次項の「サーブレット・ページ: 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>
コード・ノートは、コードの末尾に説明してあります。
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); } } }
前述の例の主要機能について説明します。
lookupPolicy()
コール(Note A)で作成され、属性はキャッシュ・ポリシー・ディスクリプタtest-policy.cpd
に基づいて設定されます。
getCache()
メソッドを使用してリポジトリから取得され(Note C)、putCache()
メソッドを使用してリポジトリに配置されます。いずれの場合もセクションIDに基づいて行われます。
isRecent()
コールは、そのキャッシュ・ブロックが再利用可能かどうかを判断します(Note D)。使用できる場合、そのキャッシュ内のデータは、キャッシュ・ブロックのgetData()
メソッドを使用して取得されます。(詳細は、「CacheBlockメソッド」を参照してください。)使用できない場合は、出力をバッファして、キャッシュ・リポジトリに保存しなおすために、特別なPrintWriter
オブジェクトが作成されます。キャッシュ・ブロック・オブジェクトが見つからない場合(nullの場合、Note E)は、キャッシュ・ポリシー・オブジェクトのputCache()
メソッドがコールされ、新規キャッシュ・ブロックが作成されます(Note F)。
このキャッシュ・ポリシー・ディスクリプタは、サンプル・アプリケーションへの3つのアプローチ(tagcode.jsp
、servletcode.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、サンプル・キャッシュ・ポリシー・ディスクリプタおよびキャッシュ・ポリシー・ディスクリプタのロードとリフレッシュに関する情報を示します。
この項では、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とサンプル・キャッシュ・リポジトリ・ディスクリプタを示します。
この項では、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が提供するキャッシュ・リポジトリ・ディスクリプタを示します。
<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のバックエンド・リポジトリとして構成する方法について説明します。
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>
|
Copyright © 2002, 2006 Oracle Corporation. All Rights Reserved. |
|