ヘッダーをスキップ
Oracle Coherence開発者ガイド
リリース3.5
B56039-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

1 Coherenceキャッシュの作成および使用

Coherenceで最も簡単かつ柔軟にキャッシュを作成する方法は、キャッシュ・コンフィギュレーション・ディスクリプタを使用してアプリケーションまたはクラスタ用のキャッシュの属性と名前を定義してから、アプリケーション・コード内でそれらのキャッシュをインスタンス化することです。その際には、ディスクリプタで定義した名前またはパターンに一致する名前で参照します。

この方法でCoherenceキャッシュを構成および使用することには、非常に重要な利点があります。キャッシュの初期化とアプリケーション内のキャッシュのアクセス・ロジックが、属性と特性から切り離されます。こうすることで、アプリケーション・デプロイメントで使用するキャッシュ・タイプに依存しないコーディングが可能になり、各キャッシュの特性(リッチ・テキスト・キャッシュ・タイプ、キャッシュ・エビクション・ポリシー、キャッシュ・タイプ固有の属性など)の変更は、コードをまったく変更せずに実行できます。これにより、同じ名前のキャッシュ・セット用に複数のコンフィギュレーションを作成できます。また、JVMノードの起動時に、使用するディスクリプタをJavaコマンドラインで指定することによって、デプロイメント時に適切なコンフィギュレーションを使用するようアプリケーションに指示することができます。

アプリケーションでのキャッシュの作成

アプリケーション・コードでキャッシュをインスタンス化するには、次を実行する必要があります。

  1. coherence.jarがクラスパスにあることを確認します。

  2. CacheFactory.getCache()を使用して、コード内でキャッシュにアクセスします。

コードは次のようになります。

import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;

...

NamedCache cache = CacheFactory.getCache("VirtualCache");

これで、NamedCache APIを使用してキャッシュ内のオブジェクトを取得したり、格納することができるようになりました。このAPIは、標準的なjava.util.Mapインタフェースを拡張して、並列処理制御(ConcurrentMapインタフェース)、キャッシュ変更をリスニングする機能(ObservableMapインタフェース)およびキャッシュを問い合せる機能(QueryMapインタフェース)などの複数の追加機能を実装したものです。

例1-1は、Javaプログラムにおける典型的なキャッシュ操作を示しています。

例1-1 Javaプログラムでの典型的なキャッシュ操作

...
// simple retrieve and update cycle
String key = "key";

// retrieve the object
MyValue value = (MyValue) cache.get(key);

// Use and modify the object
// ...

// put the new value back
cache.put(key, value);
...

キャッシュの構成

キャッシュの属性と設定は、キャッシュ・コンフィギュレーション・ディスクリプタで定義します。キャッシュ属性によって、キャッシュ・タイプ(キャッシュ・データの格納、分散および同期化に使用する方法とリソース)とキャッシュ・ポリシー(キャッシュ・サイズ、オブジェクトの存続期間およびその他のパラメータに基づいた、キャッシュ内のオブジェクトに対する処理)が決定されます。

キャッシュ・コンフィギュレーション・ディスクリプタ(coherence.jarcache-config.dtdで詳述されている)は、caching-schemescaching-scheme-mappingの2つの主要セクションで構成されます。

caching-schemesセクションでは、キャッシュまたはキャッシュ・セットの属性を定義します。キャッシング・スキームには複数のタイプがあり、それぞれに独自の属性があります。キャッシング・スキームの定義は最初から行えますが、他の既存のキャッシング・スキームの属性を取り込むこともできます。この場合、それらのscheme-namesを参照した後(scheme-ref要素を使用する)、一部の属性をオーバーライドしてキャッシング・スキームを新規作成します。この柔軟性により、メンテナンスが簡単で再利用しやすく、非常に柔軟性の高いキャッシング・スキーム構造を作成することができます。

caching-scheme-mappingセクションでは、特定のキャッシュ名またはネーミング・パターンをキャッシュ・スキームに添付し、特定の名前またはネーミング・パターンに一致したキャッシュで使用するキャッシュ・コンフィギュレーションを定義します。たとえば、前項のキャッシュ(VirtualCache)のキャッシュ・ディスクリプタを定義する場合は、次のようになります。

例1-2 キャッシュ・コンフィギュレーション・ファイルのサンプル

<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">

<cache-config>
    <caching-scheme-mapping>
    <!--
    Caches with any name will be created as default replicated.
    -->
    <cache-mapping>
        <cache-name>*</cache-name>
        <scheme-name>default-replicated</scheme-name>
    </cache-mapping>
    </caching-scheme-mapping>

    <caching-schemes>
        <!--
        Default Replicated caching scheme.
        -->
        <replicated-scheme>
            <scheme-name>default-replicated</scheme-name>
            <service-name>ReplicatedCache</service-name>
            <backing-map-scheme>
                <class-scheme>
                    <scheme-ref>default-backing-map</scheme-ref>
                </class-scheme>
            </backing-map-scheme>
        </replicated-scheme>

        <!--
        Default backing map scheme definition used by all
        The caches that do not require any eviction policies
        -->
        <class-scheme>
            <scheme-name>default-backing-map</scheme-name>
            <class-name>com.tangosol.util.SafeHashMap</class-name>
        </class-scheme>

    </caching-schemes>
</cache-config>

このキャッシュ・コンフィギュレーション・ディスクリプタは、すべてのキャッシュ(VirtualCacheキャッシュを含む)を、default-replicatedキャッシング・スキームを使用して作成するように指定します。default-replicatedキャッシング・スキームが、replicated-schemeとして定義されます。その際には、ReplicatedCacheというサービスと、default-backing-mapという、com.tangosol.util.SafeHashMapクラス(エビクション・ポリシーが不要な場合にCoherenceで使用するデフォルトのバッキング・マップ・ストレージ)として定義されているバッキング・マップが使用されます。

その後、レプリケーション・キャッシュを使用するにはキャッシュに保持されているエントリ数が多すぎたり、オブジェクトに対する更新が頻繁すぎると判断されたため、VirtualCacheキャッシュを(他のすべてのキャッシュをレプリケートした状態のままで)分散キャッシュに変更するとします。この新しい状況に対処するために、分散キャッシュ用の次のcache-scheme定義をcaching-schemesセクションに追加して、キャッシュ・コンフィギュレーションを変更できます。

例1-3 分散キャッシュ用のcache-schemeの定義

<!--
Default Distributed caching scheme.
-->
<distributed-scheme>
    <scheme-name>default-distributed</scheme-name>
    <service-name>DistributedCache</service-name>
    <backing-map-scheme>
        <class-scheme>
            <scheme-ref>default-backing-map</scheme-ref>
        </class-scheme>
    </backing-map-scheme>
</distributed-scheme>

次に、caching-schemes-mappingセクションで、VirtualCacheキャッシュをこのキャッシュにマッピングします。

例1-4 分散キャッシュへのマッピング

<cache-mapping>
    <cache-name>VirtualCache</cache-name>
    <scheme-name>default-distributed</scheme-name>
</cache-mapping>

その結果、キャッシュ定義ディスクリプタは例1-5のようになります。

例1-5 分散キャッシュの構成

<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">

<cache-config>
    <caching-scheme-mapping>
        <!--
        Caches with any name will be created as default replicated.
        -->
        <cache-mapping>
            <cache-name>*</cache-name>
            <scheme-name>default-replicated</scheme-name>
        </cache-mapping>
        <cache-mapping>
            <cache-name>VirtualCache</cache-name>
            <scheme-name>default-distributed</scheme-name>
        </cache-mapping>
    </caching-scheme-mapping>

    <caching-schemes>
        <!--
        Default Replicated caching scheme.
        -->
        <replicated-scheme>
            <scheme-name>default-replicated</scheme-name>
            <service-name>ReplicatedCache</service-name>

            <backing-map-scheme>
                <class-scheme>
                    <scheme-ref>default-backing-map</scheme-ref>
                </class-scheme>
            </backing-map-scheme>
        </replicated-scheme>

        <!--
        Default Distributed caching scheme.
        -->
        <distributed-scheme>
            <scheme-name>default-distributed</scheme-name>
            <service-name>DistributedCache</service-name>

            <backing-map-scheme>
                <class-scheme>
                    <scheme-ref>default-backing-map</scheme-ref>
                </class-scheme>
            </backing-map-scheme>
        </distributed-scheme>

        <!--
        Default backing map scheme definition used by all
        The caches that do not require any eviction policies
        -->
        <class-scheme>
            <scheme-name>default-backing-map</scheme-name>

            <class-name>com.tangosol.util.SafeHashMap</class-name>
        </class-scheme>

    </caching-schemes>
</cache-config>

ディスクリプタを修正およびデプロイしてクラスタを再起動すると、コーディングを変更せずに、VirtualCacheキャッシュがレプリケーション・キャッシュではなく分散キャッシュになります。

キャッシュ・コンフィギュレーション・ディスクリプタの場所

Coherenceで、キャッシュ・コンフィギュレーション・ディスクリプタの場所を指示する方法について説明します。Coherenceでは、Javaコマンドラインで何も指定しなくても、クラスパス内にあるcoherence-cache-config.xmlというキャッシュ・コンフィギュレーション・ディスクリプタが使用されます。このファイルはcoherence.jarに同梱されているため、クラスパスでcoherence.jarより前の場所に同じ名前の別ファイルが存在しないかぎり、このファイルが使用されます。Coherenceで別のデフォルト・ディスクリプタを使用するように指定するには、-Dtangosol.coherence.cacheconfig javaコマンドライン・プロパティを次のように使用します。

java -Dtangosol.coherence.cacheconfig=/cfg/my-config.xml AppServer

このコマンドは、Coherenceに/cfgディレクトリ内のmy-config.xmlファイルをデフォルトのキャッシュ・コンフィギュレーション・ディスクリプタとして使用するよう指示します。この機能によって、アプリケーション・コードを変更せずに、アプリケーションのデプロイメント時または起動時に別のキャッシュ・コンフィギュレーション・ディスクリプタを指定するだけで、アプリケーションのキャッシュ・コンフィギュレーションを柔軟に変更できます。

構築: Coherenceキャッシュの最初の例

前項で説明したキャッシュとキャッシュ・コンフィギュレーション・ディスクリプタを使用して、ワーキング・キャッシュの例を作成してみましょう。これを初めて行う場合の最も簡単な方法は、Coherenceコマンドライン・アプリケーションを使用することです。始める前に、この例に関して次の2点に注意してください。

テスト環境の設定

テスト環境を設定するには、1台以上のマシンの目的の場所でソフトウェアを解凍することにより、Coherenceをインストールする必要があります。

coherence/examplesディレクトリには、この演習で使用する次の例が含まれています。

これをデプロイして実行するには、次のJavaコマンドラインを(coherenceディレクトリから)実行する必要があります。

起動すると、次のように表示されます。

例1-6 Coherenceサーバー起動時の出力

D:\coherence>java -cp ./lib/coherence.jar;./examples/java -Dtangosol.coherence.cacheconfig=./examples/config/explore-config.xml
com.tangosol.examples.explore.SimpleCacheExplorer
2008-09-15 16:54:18.745 Oracle Coherence 3.4/405(thread=main, member=n/a): Loaded operational configuration from
resource "jar:file:/D:/coherence/lib/coherence.jar!/tangosol-coherence.xml"
2008-09-15 16:54:18.745 Oracle Coherence 3.4/405 (thread=main, member=n/a): Loaded operational overrides from
resource "jar:file:/D:/coherence/lib/coherence.jar!/tangosol-coherence-override-dev.xml"
2008-09-15 16:54:18.745 Oracle Coherence 3.4/405 (thread=main, member=n/a): Optional configuration override
"/tangosol-coherence-override.xml" is not specified
2008-09-15 16:54:18.755 Oracle Coherence 3.4/405 (thread=main, member=n/a): Optional configuration override
"/custom-mbeans.xml" is not specified

Oracle Coherence Version 3.4/405
Grid Edition: Development mode
Copyright (c) 2000-2008 Oracle. All rights reserved.

2008-09-15 16:54:18.945 Oracle Coherence GE 3.4/405(thread=main, member=n/a): Loaded cache configuration from
file "D:\coherence\examples\config\explore-config.xml"
2008-09-15 16:54:19.716 Oracle Coherence GE 3.4/405(thread=Cluster, member=n/a): Service Cluster joined the
cluster with senior service member n/a
2008-09-15 16:54:22.921 Oracle Coherence GE 3.4/405(thread=Cluster, member=n/a): Created a new cluster
"cluster:0x19DB" with Member(Id=1, Timestamp=2008-09-15 16:54:19.396, Address=xxx.xxx.xxx.xxx:8088, MachineId=6522,
Location=site:mydomain.com,machine:mycomputer,process:3500, Role=TangosolSimpleCacheExplorer, Edition=Grid Edition, Mode=Development,
CpuCount=1, SocketCount=1) UID=0x0A8F9C7A0000011BE70BDE04197A1F98
2008-09-15 16:54:23.001 Oracle Coherence GE 3.4/405(thread=ReplicatedCache, member=1): Service ReplicatedCache
joined the cluster with senior service member 1

Command:

Helpと入力すると、SimpleCacheExplorerのコマンドライン・オプションが表示されます。場合によっては、Commandプロンプトを表示するために[Enter]を押す必要があります。

例1-7 helpコマンドの出力

Command: help

clear
get
keys
info
put
quit
remove

Command:

infoと入力すると、コンフィギュレーションおよびメンバーの情報が表示されます(次の例では、2つのクラスタ・メンバーがアクティブになっている)。

例1-8 infoコマンドの出力

Command: info

>> VirtualCache cache is using a cache-scheme named 'default-replicated' defined as:
<replicated-scheme>
  <scheme-name>default-replicated</scheme-name>
  <service-name>ReplicatedCache</service-name>
  <backing-map-scheme>
    <class-scheme>
      <scheme-ref>default-backing-map</scheme-ref>
    </class-scheme>
  </backing-map-scheme>
</replicated-scheme>

>> The following member nodes are currently active:
Member(Id=1, Timestamp=2008-09-15 16:54:19.396, Address=xxx.xxx.xxx.xxx:8088, MachineId=6522, Location=site:mydomain.com,machine:
mycomputer,process:3500, Role=TangosolSimpleCacheExplorer) <-- this node
Member(Id=2, Timestamp=2008-09-15 17:19:56.096, Address=xxx.xxx.xxx.xxx:8089, MachineId=6522, Location=site:mydomain.com,machine:
mycomputer,process:3892, Role=TangosolSimpleCacheExplorer)

Command:

キャッシュに値を追加することもできます。

例1-9 キャッシュへの値の追加

Command: put 1 One

>> Put Complete

Command:

また、キャッシュから値を取得することもできます。

例1-10 キャッシュからの値の取得

Command: get 1

>> Value is One

Command:

これらのコマンドを複数のセッションから実行し、結果を確認します。examples/jsp/explore/SimpleCacheExplorer.jspは、お好みのアプリケーション・サーバーで使用できるJSPファイルです。

コマンドライン・アプリケーションと同様に、アプリケーション・サーバーの複数のインスタンスからエントリの追加、更新および削除を行ってみます。また、ページの下部に表示される、キャッシュ・コンフィギュレーションやクラスタ・メンバーシップに関する情報にも注意してください。この情報は、クラスタ・メンバーを追加および削除するたびに変更されます。

キャッシュ・コンフィギュレーションの変更

テスト設定に慣れたら、この簡単なテスト・ハーネスを使用して、キャッシュ・コンフィギュレーションを変更して変更内容をテストします。キャッシュ・コンフィギュレーションを変更するたびに、クラスタのすべてのメンバーをシャットダウンしてから再起動する必要があります(アプリケーション・サーバー・インスタンス、または単純なJava JVMのどちらを使用しているかに関係なく)。テストはすべて、coherence/examples/config/explore-config.xmlを使用するように構成されているため、キャッシュ・コンフィギュレーションを変更する場合は、このファイルを編集する必要があります。前述の最初の変更を行います。次のセクション(太字部分)を追加して、VirtualCacheを分散キャッシュに変更します。

例1-11 cache-configファイルでの分散キャッシュの指定

<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">

<cache-config>
    <caching-scheme-mapping>
        <!--
        Caches with any name will be created as default replicated.
        -->
        <cache-mapping>
            <cache-name>*</cache-name>
            <scheme-name>default-replicated</scheme-name>
        </cache-mapping>
       <cache-mapping>
            <cache-name>VirtualCache</cache-name>
            <scheme-name>default-distributed</scheme-name>
        </cache-mapping>
    </caching-scheme-mapping>

    <caching-schemes>
        <!--
        Default Replicated caching scheme.
        -->
        <replicated-scheme>
            <scheme-name>default-replicated</scheme-name>
            <service-name>ReplicatedCache</service-name>

            <backing-map-scheme>
                <class-scheme>
                    <scheme-ref>default-backing-map</scheme-ref>
                </class-scheme>
            </backing-map-scheme>
        </replicated-scheme>

        <!--
        Default Distributed caching scheme.
        -->
        <distributed-scheme>
            <scheme-name>default-distributed</scheme-name>
            <service-name>DistributedCache</service-name>

            <backing-map-scheme>
                <class-scheme>
                    <scheme-ref>default-backing-map</scheme-ref>
                </class-scheme>
            </backing-map-scheme>
        </distributed-scheme>

        <!--
        Default backing map scheme definition used by all
        The caches that do not require any eviction policies
        -->
        <class-scheme>
            <scheme-name>default-backing-map</scheme-name>

            <class-name>com.tangosol.util.SafeHashMap</class-name>
        </class-scheme>

    </caching-schemes>
</cache-config>

変更内容を保存してテスト・インスタンスを再起動した後で、キャッシュの動作を確認するためにテスト・データを入力すると、そのテストのキャッシュ・コンフィギュレーション・セクションで、次のように表示されます。

キャッシュ・コンフィギュレーション・ディスクリプタに従って、VirtualCacheキャッシュが分散されます。

ここで、デフォルトの分散キャッシュのエビクション・ポリシーを追加します。LRUエビクション・ポリシーで、サイズを1ノードにつき5エントリに制限し、エントリの有効期限を60秒に設定します。これを行うには、ディスクリプタを次のように(太字部分)変更する必要があります。

例1-13 cache-configファイルへのエビクション・ポリシーの追加

<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">
<cache-config>
    <caching-scheme-mapping>
        <!--
        Caches with any name will be created as default replicated.
        -->
        <cache-mapping>
            <cache-name>*</cache-name>
            <scheme-name>default-replicated</scheme-name>
        </cache-mapping>
        <cache-mapping>
            <cache-name>VirtualCache</cache-name>
            <scheme-name>default-distributed</scheme-name>
        </cache-mapping>
    </caching-scheme-mapping>
    <caching-schemes>
        <!--
        Default Replicated caching scheme.
        -->
        <replicated-scheme>
            <scheme-name>default-replicated</scheme-name>
            <service-name>ReplicatedCache</service-name>
            <backing-map-scheme>
                <class-scheme>
                    <scheme-ref>default-backing-map</scheme-ref>
                </class-scheme>
            </backing-map-scheme>
        </replicated-scheme>
        <!--
        Default Distributed caching scheme.
        -->
        <distributed-scheme>
            <scheme-name>default-distributed</scheme-name>
            <service-name>DistributedCache</service-name>
            <backing-map-scheme>
              <local-scheme>
                <scheme-ref>default-eviction</scheme-ref>
                <eviction-policy>LRU</eviction-policy>
                <high-units>5</high-units>
                <expiry-delay>60</expiry-delay>
              </local-scheme>
            </backing-map-scheme>
        </distributed-scheme>
        <!--
        Default backing map scheme definition used by all
        The caches that do not require any eviction policies
        -->
        <class-scheme>
            <scheme-name>default-backing-map</scheme-name>
            <class-name>com.tangosol.util.SafeHashMap</class-name>
        </class-scheme>
        <!--
        Default eviction policy scheme.
        -->
        <local-scheme>
          <scheme-name>default-eviction</scheme-name>
          <eviction-policy>HYBRID</eviction-policy>
          <high-units>0</high-units>
          <expiry-delay>3600</expiry-delay>
        </local-scheme>
    </caching-schemes>
</cache-config>

汎用のlocal-schemeであるdefault-evictionを定義してから(サイズ制限なし、有効期限5分、HYBRIDエビクション・ポリシー)、default-distributedスキーム定義用に参照で(scheme-refを使用)使用しました。その際には、要件に一致するようにコンフィギュレーション設定をオーバーライドしています。

変更内容を保存してテスト・インスタンスを再起動した後で、キャッシュの動作を確認するためにテスト・データを入力すると、そのテストのキャッシュ・コンフィギュレーション・セクションで、次のように表示されます。

特定のエントリの最終更新時間に注意しながら、追加と取得(putとget)を何度か行います。ノードごとのエントリ数が5個を超えないこと(2ノードを実行している場合は10個以下、3ノードの場合は15個以下になる)と、60秒間更新しない場合または6つ目のエントリを追加したときに(最低使用頻度のエントリが最初にキャッシュから削除される)、エントリが失効することがわかります(ヒント: SimpleCacheExplorer.javakeysコマンドを使用すると、キャッシュ内のキー・リストが表示される)。

これらの例は、コード変更を行わずにキャッシュ・コンフィギュレーションを変更するための一般的な方法を示しています(テスト・アプリケーション・コードは一切変更していない)。使用可能なキャッシュ・コンフィギュレーション・ディスクリプタ設定、およびその意味と設定方法の詳細は、coherence.jarのcache-config.dtdを参照してください。