ヘッダーをスキップ
Oracle Application Development Framework開発者ガイド
10g(10.1.3.0)
B40012-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

15 キャッシングによるアプリケーション・パフォーマンスの最適化

この章では、既存のアプリケーション・ページにキャッシング・サポートを追加する方法について説明します。

この章の内容は次のとおりです。

15.1 キャッシングについて

ほとんどのWebベースのアプリケーションでは、リクエストの大部分は同一または類似のコンテンツに対して行われます。動的コンテンツと静的コンテンツの両方に対してこのように繰返しリクエストが行われることにより、アプリケーションのインフラストラクチャには大きな負荷がかかります。

キャッシングにより、Webページの全部または一部がそれ以降のレスポンスで使用するためにメモリーに格納されます。クライアント・リクエストへのレスポンス時間は、それ以降のリクエストに対して、コンテンツを作成するコードを実行せずに、キャッシュされたコンテンツを再利用することで、著しく短縮されます。

Oracle ADF Facesキャッシュでは、リクエストにより生成されたレスポンスの一部をキャッシュする簡便な方法が提供されています。キャッシュするフラグメント・コンテンツを、開始タグ<afc:cache>および終了タグ</afc:cache>を使用してラップするだけです。動的コンテンツと静的コンテンツの両方をキャッシュすることにより、スループットを向上させ、レスポンス時間を短縮することができます。

<afc:cache>タグを追加すると、次のフラグメント・タイプをキャッシュできます。

JavaServer Faces(JSF)を使用して開発したアプリケーションでは、ADF Facesキャッシュ・ライブラリを使用できます。

15.2 ADF Facesキャッシュを使用したコンテンツのキャッシング

次のタイプのコンテンツについては、<afc:cache>タグを使用することを検討してください。

SRDemoアプリケーションでは、いくつかのページでCacheコンポーネントを使用してフラグメントをキャッシュしています。キャッシング・サポートがどのようにSRCreate.jspxおよびSRFaq.jspxに追加されているかを分析することで、アプリケーション内のフラグメントがキャッシュされる方法をより深く理解できます。

図15-1は、SRCreate.jspxページを示しています。このページには、次のキャッシュ可能なフラグメントが含まれています。

これらのフラグメントは特定のユーザーがセッション全体にわたって共有したり、すべてのユーザーが共有することができるため、キャッシングに適しています。

図15-1 SRDemoアプリケーションでの「Create New Service Request」ページ

「Create New Service Request」ページの図

例15-1に、最初のフラグメント(ページ・コンテンツの先頭)のコードを示します。

例15-1 ページ先頭コンテンツのフラグメント

<!--Page Content Start-->
<afc:cache duration="864000">
   <af:objectSpacer width="10" height="10"/>
   <af:panelHorizontal>
     <f:facet name="separator">
       <af:objectSpacer width="4" height="10"/>
     </f:facet>
     <af:outputText value="#{res['srcreate.faqText']}"/>
     <af:commandLink text=" #{res['srcreate.faqLink']}"
                              action="dialog:FAQ" useWindow="true"
                              immediate="true" partialSubmit="true"/>
   </af:panelHorizontal>
   <af:objectSpacer width="10" height="10"/>
   <af:outputFormatted value="#{res['srcreate.explainText']}"/>
   <af:objectSeparator/>
</afc:cache>

<afc:cache>タグの属性は、次のものを指定しています。

例15-2に、2番目のフラグメント(機器を選択するためのpanelFormコンポーネント)のコードを示します。

例15-2 機器選択のフラグメント

<af:panelForm>
  <afc:cache duration="86400"
             varyBy="userInfo.userId">
   <af:panelLabelAndMessage valign="top"
                            label="#{res['srcreate.info.1']}">
    <af:selectOneListbox id="navList1" autoSubmit="false"
                         value="#{bindings.findAllProduct1.inputValue}"
                         size="6" required="true">
      <f:selectItems value="#{bindings.findAllProduct1.items}"/>
    </af:selectOneListbox>
   </af:panelLabelAndMessage>
  </afc:cache>

<afc:cache>タグの属性は、次のものを指定しています。

例15-3に、3番目のフラグメント(ページ最上部に並んだ各タブ)のコードを示します。

例15-3 メニュー・タブのフラグメント

<f:facet name="menu1">
    <afc:cache duration="864000"
               varyBy="userInfo.userId">
    <af:menuTabs var="menuTab" value="#{menuModel.model}">
      <f:facet name="nodeStamp">
        <af:commandMenuItem text="#{menuTab.label}"
                            action="#{menuTab.getOutcome}"
                            rendered="#{menuTab.shown and menuTab.type=='default'}"
                           disabled="#{menuTab.readOnly}"/>
      </f:facet>
    </af:menuTabs>
  </afc:cache>
</f:facet>

<afc:cache>タグの属性は、次のものを指定しています。

例15-4に、最後のフラグメント(「Logout」および「Help」メニュー項目)のコードを示します。

例15-4 「Logout」および「Help」メニューのフラグメント

<f:facet name="menuGlobal">
    <afc:cache duration="86400">
      <af:menuButtons>
        <af:commandMenuItem text="#{res['srdemo.menu.logout']}"
                            action="GlobalLogout"
                            immediate="true"
                            icon="/images/logout.gif"/>
        <af:commandMenuItem text="#{res['srdemo.menu.help']}"
                            action="GlobalHelp"
                            immediate="true"
                            icon="/images/help.gif"/>
      </af:menuButtons>
    </afc:cache>
</f:facet>

図15-2は、SRFaq.jspxページを示しています。このページのコンテンツは、すべてのユーザーによって共有可能です。

図15-2 SRDemoアプリケーションの「Frequently Asked Questions」ダイアログ

SRDemoの「Frequently Asked Questions」ダイアログの図

例15-5に、このページ・フラグメントのコードを示します。

例15-5 FAQのフラグメント

<f:view>
    <afc:cache duration="86400"
               searchKeys="FAQ"
...FAQ Page Content...
   </afc:cache>
</f:view>

<afc:cache>タグの属性は、次のものを指定しています。

15.2.1 ADF Facesキャッシュのサポートを追加する方法

Cacheコンポーネントを使用するには、ADF Facesキャッシュ・ライブラリをアプリケーションのプロジェクトに追加し、ライブラリを特定のJSPページに適用します。

ADF Facesキャッシュ・ライブラリを追加する手順:

  1. アプリケーション・ナビゲータで、Cacheコンポーネントを使用するプロジェクトを選択します。

  2. ポップアップ・メニューから「プロジェクト・プロパティ」を選択します。

    「プロジェクト・プロパティ」ダイアログが開きます。

  3. 「ライブラリ」ノードを選択します。

  4. 「ライブラリ」ページで「ライブラリの追加」をクリックします。

  5. 選択ツリー内でADF Facesキャッシュ・ライブラリを見つけ、「OK」をクリックします。

  6. 「ライブラリ」ページで「OK」をクリックします。

  7. JSPドキュメントまたはページごとに、<afc:cache>タグを適用する計画を立て、次のライブラリ構文を<jsp:root>タグに追加します。

    xmlns:afc="http://xmlns.oracle.com/adf/faces/webcache"
    

    これで、コンポーネント・パレットからCacheコンポーネントを挿入したり、「コード・インサイト」を使用して<afc:cache>タグを使用することができます。

15.2.2 フラグメントをキャッシュするときに行われる処理

<afc:cache>タグを含むアプリケーションを実行すると、コンテンツは、ブラウザにより最初にそのコンテンツがリクエストされた時点でキャッシュされます。キャッシュされた後、コンテンツはキャッシュからサービスされます。コンテンツがキャッシュに挿入された日時、およびフラグメント・リクエストから発生したキャッシュ・ヒットとキャッシュ・ミスの数は、次のツールを組み合せて使用すると確認できます。

15.2.2.1 ロギング

ADF Facesキャッシュを使用すると、JavaロギングAPI(java.util.logging.Logger)によってイベントおよびエラー・メッセージが記録されます。これらのメッセージには、オブジェクトがキャッシュに挿入されて、キャッシュから使用された方法が順に示されます。

j2ee-logging.xmlファイル内に指定されているロギング構成に応じて、ロギング情報をJDeveloperのログ・ウィンドウに表示し、log.xmlファイルに書き込むことができます。j2ee-logging.xmlファイルでは、log.xmlのディレクトリ・パス情報が指定されます。

例15-6に、フラグメントSRCreate.jspxが最初にリクエストされ、キャッシュ内に見つからず(cache miss)、キャッシュに挿入された(insert)場合のログ部分を示します。SRCreate.jspxが再びリクエストされ、キャッシュから使用されています(cache hit)。

例15-6 ログ・サンプル

fragment is SRCreate.jspx:_id13
fragment (SRCreate.jspx:_id13) fetch: cache miss
fragment (SRCreate.jspx:_id13) insert: cached for 86400 secs
...
fragment is SRCreate.jspx:_id19
fragment (SRCreate.jspx:_id19) fetch: cache hit
...

関連項目:

j2ee-logging.xmlファイルの詳細は、A.9項を参照してください。

15.2.2.2 AFC統計サーブレット

AFC統計サーブレット(図15-3)では、次のキャッシュ統計が表示されます。これらの統計を使用すると、キャッシュのスループットの全体的な概要がわかります。

  • キャッシュ内のオブジェクト数: キャッシュ内に格納されているオブジェクトの数。

  • キャッシュ・ヒットの数: キャッシュ内のオブジェクトが使用されたリクエストの数。

  • キャッシュ・ミスの数: キャッシュが使用されなかったキャッシュ可能リクエストの数。この数は、最初のリクエストと、リフレッシュされた無効化済または期限切れのオブジェクトに対するリクエストの合計を表します。

  • 無効化リクエスト数: キャッシュによりサービスされた無効化リクエストの数。

  • 無効化されたドキュメント数: キャッシュにより無効化されたオブジェクトの合計数。

    無効化リクエスト数無効化されたドキュメント数は同じでないこともあります。この違いは、1つの検索キーが複数のオブジェクトに適用されることがあるために発生します。

図15-3に示されている「統計をリセットするにはここをクリックしてください。」リンクをクリックすると、キャッシュ内のオブジェクト数を除いて、これらの統計がリセットされます。

図15-3 AFC統計サーブレット

AFC統計サーブレット情報の図

サーブレットを有効化する手順:

  1. アプリケーションの/WEB-INFディレクトリのweb.xmlファイル内に次のエントリを作成します。

    <servlet>
       <servlet-name>AFCStatsServlet</servlet-name>
       <servlet-class>oracle.webcache.adf.servlet.AFCStatsServlet</servlet-class>
    </servlet>
    
  2. ブラウザで次のURLを宛先指定します。

    http://application_host:application_port/application-context-root/servlet/AFCStatsServlet
    

関連項目:

AFC統計サーブレットの詳細は、JDeveloperのオンライン・ヘルプのキャッシュ・パフォーマンス統計の表示に関するトピックを参照してください。

15.2.2.3 ビジュアル診断

ビジュアル診断機能を使用すると、フラグメントがキャッシュ・ヒットかキャッシュ・ミスかを視覚的に表示できます。この機能により、キャッシュ・ヒットまたはキャッシュ・ミスのステータスに対して適切なクラスを使用して、HTML <SPAN>タグを持つフラグメント出力に境界が設定されます。固有のクラス・スタイルを設定することにより、フラグメントがキャッシュに格納されているかどうかを視覚的に判断できます。

SRDemoアプリケーションではビジュアル診断機能を使用していませんが、この機能を使用すると、アプリケーションをテストする際に便利です。


関連項目:

詳細は、JDeveloperのオンライン・ヘルプのビジュアル診断の使用に関するトピックを参照してください。

15.2.3 留意事項

AFC統計サーブレットを使用すると、次の問題が発生することがあります。

  • 「HTTP 404 Page Not Found」エラー・コード

    サーブレットへのアクセス時にこのエラーが発生した場合は、構成問題が起因している可能性があります。

    この問題を解決するには、web.xmlファイル内に次の行が存在していることを確認します。

    <servlet>
       <servlet-name>AFCStatsServlet</servlet-name>
       <servlet-class>oracle.webcache.adf.servlet.AFCStatsServlet</servlet-class>
    </servlet>
    
    
  • 「キャッシュ・インスタンスが実行されていません。」エラー

    このエラーは、キャッシュを監視するためにサーブレットが起動されていないために発生します。サーブレットは、最初のオブジェクトがキャッシュに挿入され、キャッシュ・インスタンスが作成されてた時点で、キャッシュの監視を開始します。

    このエラーを回避するには、「統計をリセットするにはここをクリックしてください。」を選択します。