プライマリ・コンテンツに移動

Oracle Enterprise Pack for Eclipse Oracle Mobile Application Framework (OEPE Edition)でのモバイル・アプリケーションの開発 リリース2.1.3 E67371-01 |
| 目次

前 | 次 |

# 26 データのキャッシュ

この章では、MAFアプリケーションでデータ・キャッシュを有効にする方法を説明します。

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

- 第26.1項「データ・キャッシュの概要」

## 26.1 データ・キャッシュの概要

データ・キャッシュは、モバイル・アプリケーションのユーザーに優れたユーザー操作性を提供するための重要な要素です。ユーザーは、モバイル・アプリケーションがいつでも使用でき、機能することを期待します。実際には、モバイル・アプリケーションの接続の信頼性が低いことはよく知られており、ネットワーク接続を使用できなかったり、接続の確立時につながったり切れたりを繰り返し、最終的に切断されることがあります。モバイル・アプリケーションで最適なユーザー操作性を実現するため、MAFには、オフライン時でも継続して機能するアプリケーションを開発できるAPIが用意されているので、モバイル・アプリケーションでの最適なユーザー操作性が保証されます。ネットワーク接続が使用できない場合、モバイル・アプリケーションではローカルに格納されているキャッシュ・データにアクセスして、シームレスなユーザー操作を確保します。

オフライン・データ格納の中心にあるのは、ユーザー操作性を向上するポリシーのセットであり、このポリシーでは、ローカル・キャッシュに格納されているRESTリソースをモバイル・アプリケーションでどのようにリフレッシュするかを記述します。アプリケーションでは、サーバーからデータを取得するよりも、デバイスに格納されているデータをオフライン読取りを使用してフェッチする方がすばやく実行できるため、これらのポリシーでは、リクエストの処理方法を同期クライアントSDKに指示し、アプリケーションのパフォーマンスを向上できます。これらのポリシーでは、インターネットに接続できなくなった場合にオフライン読取りを有効にすることで、アプリケーション・キャッシュで最適なユーザー操作性を維持することもできます。

### 26.1.1 sync-config.xmlファイルを使用したデータ・キャッシュの実装

MAFに含まれる同期クライアントは、デバイスのMAFアプリケーション内に存在します。同期クライアントは、データをキャッシングするときに特定のポリシーを採用して、リソースごとに定義された特定のポリシー(URLで識別)を観察することで異なるリソースをキャッシュできるようにします。同期クライアントは、`sync-config.xml`ファイルで設定されたポリシーを使用してデータをローカルにキャッシュします。データ格納およびキャッシング・ポリシー設定の構成の詳細は、第26.1.3項「キャッシング・ポリシーについて」を参照してください。データ・キャッシュを有効にする方法の詳細は、第26.1.2項「データ・キャッシュを有効にする方法」を参照してください。

`sync-config.xml`ファイルにより、モバイル・アプリケーションが、JSONペイロードによるRESTを介してアクセスされるサーバー側リソースから取得されたデータをキャッシュできるようになるだけでなく、キャッシュ内のこのデータおよびサーバー側リソースも更新できるようになります。

キャッシュ機能は、アプリケーション・コード内に実装しなくても、`sync-config.xml`ファイル内のプロパティを編集することで構成可能です。アプリケーションを作成すると、デフォルト・バージョンの`sync-config.xml`ファイルが格納されます(図26-1を参照)。`sync-config.xml`ファイルは、アセンブリ・プロジェクトの「adf」→「META-INF」ノードからアクセス可能で、OEPEエディタでファイルを変更できます。MAFランタイムは、デプロイ後にこのファイルを読み取ります。

注意: これはアプリケーション全体のリソースですが、`sync-config.xml`ファイルを機能アーカイブ(FAR)ファイルに含めることができます。FARをMAFアプリケーションに追加する場合は、FARの`sync-config.xml`ファイルがアプリケーションの`sync-config.xml`とマージされます。詳細は、第26.1.4項「FARを使用したsync-config.xmlファイルの更新に関する必知事項」を参照してください。

図26-1 sync-config.xmlファイルのデータストレージ・ポリシー設定

次の例は、デフォルトの`sync-config.xml`を示します。

    <?xml version="1.0" encoding="UTF-8"?>
    <Settings xmlns="http://xmlns.oracle.com/sync/config">
      <BaseUri>http://127.0.0.1</BaseUri>
      <AppId/>
      <LazyPersistence/>
      <RefreshPolicy/>
      <DbStorageFolderPath/>
      <FileStorageFolderPath/>
      <Policies>
        <DefaultPolicy>
          <FetchPolicy>FETCH_FROM_SERVICE</FetchPolicy>
          <UpdatePolicy>UPDATE_IF_ONLINE</UpdatePolicy>
          <ExpirationPolicy>NEVER_EXPIRE</ExpirationPolicy>
          <EvictionPolicy>MANUAL_EVICTION</EvictionPolicy>
        </DefaultPolicy>
      </Policies>
    </Settings>

次の例は、`sync-config.xml`ファイルでキャッシング属性をどのように定義できるかを示します。リクエストは、使用するポリシーを決定する場合に`baseUri`属性および`Path`要素を使用して照合されます。

    <?xml version="1.0" encoding="UTF-8"?>
    <Settings xmlns="http://xmlns.company.com/sync/config">
      <BaseUri>http://name.loc.company.com:9100</BaseUri>
      <AppId>1</AppId>
      <LazyPersistence>false</LazyPersistence>
      <MaxCachedFileSize>1024000</MaxCachedFileSize>
      <EnableEncryption>false</EnableEncryption>
        <Policies>
          <ServerGroup id="fusion" baseUri="http://name.loc.company.com:7100/"
            <Policy id="fs01">
              <Path>/stable/rest/latest/Employees</Path>
              <FetchPolicy>FETCH_FROM_SERVICE_ON_CACHE_MISS_OR_EXPIRY</FetchPolicy>
              <UpdatePolicy>QUEUE_IF_OFFLINE</UpdatePolicy>
              <ExpirationPolicy>NEVER_EXPIRE</ExpirationPolicy>
              <EvictionPolicy>EVICT_ON_EXPIRY_AT_STARTUP</EvictionPolicy>
            </Policy>
          </ServerGroup>
            <DefaultPolicy>
              <FetchPolicy>FETCH_FROM_SERVICE_ON_CACHE_MISS_OR_EXPIRY</FetchPolicy>
              <UpdatePolicy>QUEUE_IF_OFFLINE</UpdatePolicy>
              <ExpirationPolicy>EXPIRE_AFTER</ExpirationPolicy>
              <ExpireAfter>700</ExpireAfter>
              <EvictionPolicy>EVICT_ON_EXPIRY_AT_STARTUP</EvictionPolicy>
            </DefaultPolicy>
        </Policies>
    </Settings>

これらは、`sync-config.xml`ファイルのプロパティを使用してキャッシング・ポリシーを構成できるユースケースの一部です。

- ほとんど変更されない静的リスト(FETCH_FROM_SERVICE_ON_CACHE_MISS_OR_EXPIRY)

- 高度に動的なデータ(結果の文脈依存性が高いため、キャッシュを使用せずにリフレッシュする必要があります) (FETCH_FROM_CACHE_SCHEDULE_REFRESHまたはFETCH_FROM_SERVICE_IF_ONLINE)

- 検索結果など、リクエストごとに変更される可能性のあるデータ(FETCH_FROM_SERVICE)

### 26.1.2 データ・キャッシュを有効にする方法

同期クライアントは、データをキャッシングするときに特定のポリシーを採用して、リソースごとに定義された特定のポリシー(URLで識別)を観察することで異なるリソースをキャッシュできるようにします。データ・キャッシュを有効にすると、上書きしないかぎり、デフォルトの`sync-config.xml`ファイルが使用されます。

データ・キャッシュを有効にするには、次の行を`maf.properties`ファイル(アセンブリ・プロジェクトのMETA-INFの下にあります)に追加します。

    #java.commandline.argument=-DsyncEnabled=true

注意: データ・キャッシュを有効にすると、ネットワーク経由で渡されるデータはすべてキャッシュされます。キャッシングを有効にしてアプリケーションをデプロイした後、実行時にオフにする方法はありません。

データ・ストレージ・ポリシー設定の構成の詳細は、第26.1.1項「sync-config.xmlファイルを使用したデータ・キャッシュの実装」を参照してください。

### 26.1.3 キャッシング・ポリシーについて

モバイル・アプリケーションのキャッシング・ポリシーは、`sync-config.xml`ファイルで定義します。ポリシーを結合して、モバイル・アプリケーションに適切なコンテンツを提供します。

データ・ストレージ・ポリシー設定の構成の詳細は、第26.1.1項「sync-config.xmlファイルを使用したデータ・キャッシュの実装」を参照してください。

アプリケーションのキャッシング動作の構成を可能にするポリシーは、次のグループに分類されます。

- フェッチ・ポリシー — 同期クライアントSDKにリソースをフェッチするように指示します(サーバーから、ローカル・キャッシュから、2つの組合せなど)。これらのポリシーのリストは、表26-1を参照してください。

- 有効期限ポリシー — ローカル・キャッシュに格納されているリソースが期限切れまたは古い状態であることが同期クライアントSDKによって示されたため、更新ポリシー(表26-4を参照)に従って更新するか、削除ポリシー(表26-3を参照)に従って削除する必要が生じるまでの時間(秒)を設定します。有効期限ポリシーの詳細は、表26-2を参照してください。

- 削除ポリシー — ローカル・キャッシュに格納されているリソースを同期クライアントSDKが削除するタイミングを指定します。削除ポリシーは、サーバー側のリソースではなく、ローカル・キャッシュのデータのみに適用されます。ポリシーのリストは、表26-3を参照してください。

- 更新ポリシー — ローカル・キャッシュに格納されている期限切れのポリシーの更新のタイミングを定義します。ポリシーのリストは、表26-4を参照してください。

表26-1 フェッチ・ポリシー

ポリシー | 説明
--- | ---
キャッシュからフェッチ | サーバーではなく、キャッシュのみからデータをフェッチするように同期クライアントSDKに指示します。同期クライアントSDKがキャッシュ内のデータを見つけることができない場合、エラーまたはNULLオブジェクトが返されます。このポリシーを適用すると、同期クライアントSDKはデータをキャッシュから直接取得するため、クライアント・アプリケーションがオンラインまたはオフラインの場合に、このポリシーを実行できます。
サービスからフェッチ | キャッシュではなく、サーバーのみからデータを直接フェッチするように同期クライアントSDKに指示します。同期クライアントSDKは、クライアント・アプリケーションがオンラインの場合のみ、このポリシーを適用できます。それ以外の場合は、エラーまたはNULLオブジェクトがクライアント・アプリケーションに返されます。
サービスからフェッチ(オンラインの場合) | クライアント・アプリケーションがオンラインの場合はサーバーから、オフラインの場合はキャッシュからデータをフェッチするように同期クライアントSDKに指示します。
サービスからフェッチ(キャッシュミス) | キャッシュからデータをフェッチするように同期クライアントSDKに指示します。リクエストされたデータが見つからない場合、同期クライアントSDKはサーバーからフェッチします。
サービスからフェッチ(キャッシュミスまたは有効期限) | データがキャッシュに存在し、古い状態(期限切れ)ではない場合、キャッシュ内のデータをフェッチするように同期クライアントSDKに指示します。それ以外の場合、同期クライアントSDKはサーバーからリクエスト・データをフェッチします。
キャッシュからフェッチ(更新をスケジュール) | キャッシュからデータをフェッチし、バックグラウンドのリフレッシュをスケジュールして、サーバーの最新コピーからキャッシュを更新するように同期クライアントSDKに指示します。キャッシュミス(リクエストしたデータがキャッシュにない状態)がある場合、同期クライアントSDKはNULLオブジェクトをクライアント・アプリケーションに返します。
更新でフェッチ | 次の処理を実行するように同期クライアントSDKに指示します。 リクエストしたデータが存在し、期限切れでない場合、キャッシュからデータをフェッチします。 バックグラウンドのリフレッシュをスケジュールして、サーバーの最新コピーからキャッシュを更新します。 キャッシュミス(リクエストしたデータがキャッシュにない状態)がある場合、またはデータが期限切れの場合、同期クライアントSDKは、サービスからフェッチ・ポリシーの場合と同じようにデータをサーバーから直接フェッチします。

表26-2 有効期限ポリシー

ポリシー | 説明
--- | ---
再起動時に期限切れ | クライアント・アプリケーションの再起動時に、URIのデータが期限切れの状態であることを示すか、クライアント・アプリケーションによって次にコールされるときに、サーバー・コピーでローカル・データを更新するように同期クライアントSDKに指示します。
期限切れまでの時間 | 期限切れにするまでの時間ポリシーで設定した時間(秒)の経過後に、データを期限切れにするように同期クライアントSDKに指示します。このポリシーは、定期的に更新されるデータに使用されます。
期限切れにするまでの時間 | キャッシュ内のデータが期限切れの状態になったことが同期クライアントSDKによって示されるまでの秒数。
期限切れなし | ローカル・データを期限切れとして指定できないように同期クライアントSDKに指示します。

表26-3 削除ポリシー

ポリシー | 説明
--- | ---
起動時に期限切れを削除 | クライアント・アプリケーションの再起動時に、期限切れのデータをキャッシュから削除するように同期クライアントSDKに指示するか、クライアント・アプリケーションによって次にコールされるときに、サーバー・コピーでローカル・データを更新するように指示します。
手動削除 | 同期クライアントSDKは、ローカル・キャッシュからデータを自動的に削除できません。データを手動で削除するには、APIを使用します。

表26-4 更新ポリシー

ポリシー | 説明
--- | ---
オンラインの場合に更新 | クライアント・アプリケーションがオンラインの場合のみ、サーバー側のデータでのみローカル・キャッシュを更新するように同期クライアントSDKに指示します。それ以外の場合は、同期クライアントSDKでエラーが返されます。
オフラインの場合にキュー | クライアント・アプリケーションがオンラインの場合、サーバー側のデータでローカル・キャッシュを更新するように同期クライアントSDKに指示します。クライアント・アプリケーションがオフラインの場合、同期クライアントSDKは操作をキューに入れ、クライアント・アプリケーションが再度オンラインになった場合にローカル・キャッシュを更新できるようにします。 注意: このポリシーは現在サポートされていません。

### 26.1.4 FARを使用したsync-config.xmlファイルの更新に関する必知事項

ビュー・コントローラ・プロジェクトがFARとしてデプロイされると、`sync-config.xml`ファイルは機能アーカイブ・ファイルに含まれます。`connections.xml`ファイルと同様に、FARをアプリケーションに追加すると、MAFではFAR (`jar-sync-config.xml`)内の`sync-config.xml`ファイルの内容と、使用するアプリケーションの`sync-config.xml`ファイルの内容をマージします。`sync-config.xml`ファイルは、モバイル・アプリケーションによって使用されるWebサービスのエンドポイントを記述するため、モバイル・アプリケーションを構成するアプリケーション機能によって使用されるすべてのWebサービスのエンドポイントを、FARを追加することで更新できます(第9.2項「FARのビュー・コントローラ・プロジェクトとしての追加時に行われる処理」を参照)。

FARをアプリケーションに追加すると、MAFでは、アプリケーションの`sync-config.xml`ファイルおよび`connections.xml`ファイルを確認し、必要に応じて変更するように求めるメッセージがログに記録されます。これらのメッセージは、使用するアプリケーションの`sync-config.xml`ファイルの状態を反映します。

使用するアプリケーションに`sync-config.xml`ファイルがない場合、MAFではこのファイルをアプリケーションに追加し、次のようなメッセージを書き込みます。

    oracle.adfmf.framework.dt.deploy.features.deployers.SyncConfigMerger _logNoSyncConfigInAppUsingFar
    WARNING: The application does not contain a synchronization file, "sync-config.xml". Creating one
    containing the synchronization configuration in the Feaure Archive.

`sync-config.xml`ファイルの`<ServerGroup>`要素に、使用するアプリケーションの`connections.xml`ファイルで定義された対応する`<Reference>`要素がない場合、MAFでは接続の確認(または作成)をリクエストする次のようなログ・メッセージを書き込みます。

    oracle.adfmf.framework.dt.deploy.features.deployers.SyncConfigMerger _logAddedServerGroups
    WARNING: The following server groups were added sync-config.xml by the Add to Application
    operation:
    {
      ServerGroup1 - there is no existing application connection defined for this server group.
    Please create the connection.

      ServerGroup2 - verify its configuration.
    }

使用するアプリケーションの`sync-config.xml`ファイルの`<ServerGroup>`定義が、FAR内の対応する`sync-config.xml`ファイルの定義を複製する場合、MAFでは次の`SEVERE`レベルのメッセージをログに書き込みます。

    oracle.adfmf.framework.dt.deploy.features.deployers.SyncConfigMerger _logDuplicateServerGroups
    SEVERE: Cannot merge the server groups from the Feature Archive because the following definitions
    already exist:
    ServerGroup1
    ServerGroup2