Coherenceで最も簡単かつ柔軟にキャッシュを作成する方法は、キャッシュ・コンフィギュレーション・ディスクリプタを使用してアプリケーションまたはクラスタ用のキャッシュの属性と名前を定義してから、アプリケーション・コード内でそれらのキャッシュをインスタンス化することです。その際には、ディスクリプタで定義した名前またはパターンに一致する名前で参照します。
この方法でCoherenceキャッシュを構成および使用することには、非常に重要な利点があります。キャッシュの初期化とアプリケーション内のキャッシュのアクセス・ロジックが、属性と特性から切り離されます。こうすることで、アプリケーション・デプロイメントで使用するキャッシュ・タイプに依存しないコーディングが可能になり、各キャッシュの特性(リッチ・テキスト・キャッシュ・タイプ、キャッシュ・エビクション・ポリシー、キャッシュ・タイプ固有の属性など)の変更は、コードをまったく変更せずに実行できます。これにより、同じ名前のキャッシュ・セット用に複数のコンフィギュレーションを作成できます。また、JVMノードの起動時に、使用するディスクリプタをJavaコマンドラインで指定することによって、デプロイメント時に適切なコンフィギュレーションを使用するようアプリケーションに指示することができます。
アプリケーション・コードでキャッシュをインスタンス化するには、次を実行する必要があります。
coherence.jar
がクラスパスにあることを確認します。
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プログラムにおける典型的なキャッシュ操作を示しています。
キャッシュの属性と設定は、キャッシュ・コンフィギュレーション・ディスクリプタで定義します。キャッシュ属性によって、キャッシュ・タイプ(キャッシュ・データの格納、分散および同期化に使用する方法とリソース)とキャッシュ・ポリシー(キャッシュ・サイズ、オブジェクトの存続期間およびその他のパラメータに基づいた、キャッシュ内のオブジェクトに対する処理)が決定されます。
キャッシュ・コンフィギュレーション・ディスクリプタ(coherence.jar
のcache-config.dtd
で詳述されている)は、caching-schemes
とcaching-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コマンドライン・アプリケーションを使用することです。始める前に、この例に関して次の2点に注意してください。
例の中で、ノードやJVMについて触れます。これらの実行場所に関しては、決まりはありません。同一のマシン、複数のマシン、または複数のノードを持つマシンと複数マシンの組合せで実行可能です。運用中のクラスタ・キャッシュを確認するには、2つ以上のノードでJVMの共有データを表示する必要があります(この後の例はすべて、単一マシン上の2つのJVMで取得されたものです)。
この例ではWindowsの規則とコマンドを使用しますが、UNIX環境でも同様に機能するため(UNIXのコマンドと規則に沿った修正が必要)、オペレーティング・システムが異なる複数のマシンでテストすることをお薦めします。Coherenceは、複数のプラットフォームで同時に機能するように設計されているからです。
テスト環境を設定するには、1台以上のマシンの目的の場所でソフトウェアを解凍することにより、Coherenceをインストールする必要があります。
coherence/examples
ディレクトリには、この演習で使用する次の例が含まれています。
examples/config/explore-config.xml
テスト環境の例で使用するコンフィギュレーション・ディスクリプタです。
examples/java/com/tangosol/examples/explore/SimpleCacheExplorer.java
コマンドラインからキャッシュへのアクセス方法を示すJavaクラスです。
これをデプロイして実行するには、次のJavaコマンドラインを(coherenceディレクトリから)実行する必要があります。
Windowsの場合:
java -cp ./lib/coherence.jar;./examples/java -Dtangosol.coherence.cacheconfig=./examples/config/explore-config.xml com.tangosol.examples.explore.SimpleCacheExplorer
UNIXの場合:
java -cp ./lib/coherence.jar:./examples/java -Dtangosol.coherence.cacheconfig=./examples/config/explore-config.xml com.tangosol.examples.explore.SimpleCacheExplorer
起動すると、次のように表示されます。
例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]を押す必要があります。
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:
キャッシュに値を追加することもできます。
また、キャッシュから値を取得することもできます。
これらのコマンドを複数のセッションから実行し、結果を確認します。examples/jsp/explore/SimpleCacheExplorer.jsp
は、お好みのアプリケーション・サーバーで使用できるJSPファイルです。
これをデプロイして実行するには、アプリケーション・サーバーのデフォルトのWebアプリケーション・ディレクトリにJSPをデプロイし(examples/jsp/images
ディレクトリの内容も含める)、クラスパスにcoherence.jar
が含まれるようにサーバー起動スクリプトを変更し、Javaコマンドラインで-Dtangosol.coherence.cacheconfig
オプションを使用してキャッシュ・コンフィギュレーション・ファイルの場所を指定する必要があります(例: -Dtangosol.coherence.cacheconfig=$COHERENCE_HOME/examples/config/explore-config.xml
)。
そうすることで、アプリケーション・サーバーの1つ以上のインスタンスを起動して(異なるマシンまたは異なるポート上で)、ブラウザからSimpleCacheExplorer.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>
変更内容を保存してテスト・インスタンスを再起動した後で、キャッシュの動作を確認するためにテスト・データを入力すると、そのテストのキャッシュ・コンフィギュレーション・セクションで、次のように表示されます。
SimpleCacheExplorer.java
:
例1-12 分散キャッシュを含むSimpleCacheExplorer.javaの実行
Command: info >> VirtualCache cache is using a cache-scheme named 'default-distributed' defined as: <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> >> The following member nodes are currently active: Member(Id=1, Timestamp=2008-09-15 17:53:22.701, Address=xxx.xxx.xxx.xxx:8088, MachineId=6522, Location=site:mydomain.com, machine:mycomputer,process:3156, Role=TangosolSimpleCacheExplorer) <-- this node Member(Id=2, Timestamp=2008-09-15 17:54:37.619, Address=xxx.xxx.xxx.xxx:8089, MachineId=6522, Location=site:mydomain.com, machine:mycomputer,process:916, Role=TangosolSimpleCacheExplorer) Command:
SimpleCacheExplorer.jsp
:
キャッシュ・コンフィギュレーション・ディスクリプタに従って、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を使用)使用しました。その際には、要件に一致するようにコンフィギュレーション設定をオーバーライドしています。
変更内容を保存してテスト・インスタンスを再起動した後で、キャッシュの動作を確認するためにテスト・データを入力すると、そのテストのキャッシュ・コンフィギュレーション・セクションで、次のように表示されます。
SimpleCacheExplorer.java
:
例1-14 エビクション・ポリシーを含むSimpleCacheExplorer.javaの実行
Command: info >> VirtualCache cache is using a cache-scheme named 'default-distributed' defined as: <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> >> The following member nodes are currently active: Member(Id=1, Timestamp=2008-09-15 18:10:23.148, Address=xxx.xxx.xxx.xxx:8088, MachineId=6522, Location=site:mydomain.com, machine:mycomputer,process:2960, Role=TangosolSimpleCacheExplorer) <-- this node Member(Id=2, Timestamp=2008-09-15 18:10:35.957, Address=xxx.xxx.xxx.xxx:8089, MachineId=6522, Location=site:mydomain.com, machine:mycomputer,process:3348, Role=TangosolSimpleCacheExplorer) Command:
SimpleCacheExplorer.jsp
:
特定のエントリの最終更新時間に注意しながら、追加と取得(putとget)を何度か行います。ノードごとのエントリ数が5個を超えないこと(2ノードを実行している場合は10個以下、3ノードの場合は15個以下になる)と、60秒間更新しない場合または6つ目のエントリを追加したときに(最低使用頻度のエントリが最初にキャッシュから削除される)、エントリが失効することがわかります(ヒント: SimpleCacheExplorer.java
でkeys
コマンドを使用すると、キャッシュ内のキー・リストが表示される)。
これらの例は、コード変更を行わずにキャッシュ・コンフィギュレーションを変更するための一般的な方法を示しています(テスト・アプリケーション・コードは一切変更していない)。使用可能なキャッシュ・コンフィギュレーション・ディスクリプタ設定、およびその意味と設定方法の詳細は、coherence.jarのcache-config.dtd
を参照してください。