35 基本的なCoherence JCacheタスクの実行

Coherence JCacheプロバイダを使用する場合のアプリケーション開発の標準的な基本タスクを学習します。多くの手順でJCache APIが示され、Coherence JCacheプロバイダ実装に固有な内容が含まれています。

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

JCacheプロバイダとしてのCoherenceの指定

META-INF/services/javax.cache.spi.CachingProviderサービス定義は、javax.cache.Cachingブートストラップ・クラスを使用するアプリケーションがデフォルトでCoherence JCacheプロバイダを使用することを保証します。
プロバイダ定義はcoherence-jcache.jarライブラリにあります。この章の手順および例は、Coherence JCacheプロバイダがデフォルトのJCacheプロバイダであることを前提としています。ただし、アプリケーションは複数のキャッシュ・プロバイダを登録および使用できます。そのような場合、アプリケーションにはCoherence JCacheプロバイダを選択するオプションが複数あります。

ノート:

複数のJCacheプロバイダが登録されている場合、getCachingProvider()またはgetCachingProvider(ClassLoader)メソッドを使用するとキャッシュ例外が発生します。

最初のオプションは、デフォルトのキャッシュ・プロバイダをjavax.cache.spi.cachingproviderシステム・プロパティを使用してオーバーライドし、Coherence JCacheプロバイダ実装クラスの完全修飾名を指定する方法です。たとえば:

System.setProperty("javax.cache.spi.cachingprovider",
   "com.tangosol.coherence.jcache.CoherenceBasedCachingProvider");

システム・プロパティは、実行時にコマンド行で指定することもできます。たとえば、

-Djavax.cache.spi.cachingprovider=com.tangosol.coherence.jcache.
   CoherenceBasedCachingProvider

2番目のオプションは、Caching.getCachingProvider(String)またはCaching.getCachingProvider(String, ClassLoader)メソッドを使用して、明示的にCoherence JCacheプロバイダ実装を要求する方法です。たとえば:

CachingProvider cachingProvider = Caching.getCachingProvider(
   "com.tangosol.coherence.jcache.CoherenceBasedCachingProvider");
CacheManager cacheManager = cachingProvider.getCacheManager();
...

複数のキャッシュ・プロバイダが登録されている場合は、getCachingProvidersメソッドを使用して登録済のプロバイダのリストを反復処理します。

最後のオプションとして、アプリケーションは直接Coherence JCacheプロバイダをインスタンス化することもできます。ただし、このオプションにはプロバイダ間の移植性はありません。次の例はCoherence JCacheプロバイダをインスタンス化します。

CachingProvider cachingProvider = new CoherenceBasedCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();

Coherence JCacheキャッシュの作成

Coherence JCacheプロバイダは、ローカル、パーティション、パススルーおよびリモートの4つのキャッシュ・タイプをサポートしています。ローカル・キャッシュとは、アプリケーション・プロセスにローカルのキャッシュです。パーティション・キャッシュは、Coherenceの記憶域が有効なクラスタ・メンバーにキャッシュ・データを分散させます。パススルー・キャッシュは、Coherenceキャッシュ構成ファイル内で構成されるCoherence固有のキャッシュに委任します。リモート・キャッシュは、プロキシ・サービスを使用してCoherence Extendクライアントがキャッシュにアクセスできるキャッシュです。この項では、これらのキャッシュ・タイプそれぞれのJCache APIを使用した作成方法を示します。

この項には次のトピックが含まれます:

ローカル・キャッシュの作成

アプリケーションは、ローカル・キャッシュを使用してデータをキャッシュできます。ローカル・キャッシュはCoherence JCacheプロバイダを使用する際のデフォルトのキャッシュ・タイプで、Coherenceローカル・キャッシュ・スキームに類似しています。ローカル・キャッシュはデータのバックアップを提供せず、アプリケーションが終了した後はデータは永続化されません。次の例では、JCache APIを使用してローカル・キャッシュを作成しています。

CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();

MutableConfiguration<String, String> config = 
   new MutableConfiguration<String, String>();
config.setStoreByValue(true).setTypes(String.class, String.class);

Cache<String, String> cache = cacheManager.createCache("MyCache", config);

ローカル・キャッシュは、jcache-local-serviceサービスによって管理されるjcache-local-schemeという名前のローカル・キャッシュ・スキームにマップされるjcache-local-*キャッシュ名を使用するCoherence NamedCacheインスタンスを作成します。

パーティション・キャッシュの作成

アプリケーションは、Coherenceパーティション・キャッシュにデータをキャッシュできます。アプリケーション・プロセスは自動的にCoherenceクラスタに参加し、Coherenceはクラスタ全体のデータの分散およびバックアップを管理します。パーティション・キャッシュはいかなるアプリケーションのコードの変更も必要としないため、既存のJCacheアプリケーションは簡単にCoherenceパーティション・キャッシュを使用するように移行できます。

ノート:

パーティション・キャッシュは参照による格納セマンティクスをサポートしていません。

パーティション・キャッシュを作成するには、tangosol.coherence.jcache.configuration.classnameプロパティにpartitionedを設定します。たとえば:

-Dcoherence.jcache.configuration.classname=partitioned

システム・プロパティは、何の値も指定されなかった場合のデフォルト値であり、ローカル・キャッシュが作成されるlocalという値もサポートします。

パーティション・キャッシュは、jcache-partitioned-serviceサービスによって管理されるjcache-partitioned-schemeという名前のパーティション・キャッシュ・スキームにマップされるjcache-partitioned-*キャッシュ名を使用するCoherence NamedCacheインスタンスを作成します。

オペレーション構成

JCacheアプリケーションは、tangosol-coherence-override.xmlオペレーション・オーバーライド・ファイルおよびCoherenceシステム・プロパティのいずれかまたは両方を使用してCoherenceオペレーション設定を構成する必要があります。とりわけこのオペレーション設定によって、アプリケーションは既存のクラスタへ参加できるようになります。オペレーション構成ファイルの指定を参照してください。たとえば、アプリケーションは実行時に次のシステム・プロパティを指定してCluster1という名前でマルチキャスト・アドレス231.1.1.1およびポート7574を持つクラスタに参加できます。

-Dcoherence.cluster=Cluster1
-Dcoherence.clusteraddress=231.1.1.1
-Dcoherence.clusterport=7574

キャッシュ構成

JCache用のパーティション・キャッシュは、自動的にcoherence-jcache.jarライブラリに含まれるデフォルトのCoherenceキャッシュ構成ファイルを使用します。この構成ファイルの名前はcoherence-jcache-cache-config.xmlです。クラスタ内のキャッシュ・サーバーは、coherence-jcache-cache-config.xmlファイルも使用する必要があります。たとえば、キャッシュ・サーバーはcoherence.cacheconfigシステム・プロパティを使用して明示的にキャッシュ構成ファイルを設定できます。

-Dcoherence.cacheconfig=coherence-jcache-cache-config.xml

既存のCoherenceキャッシュ構成ファイルも使用できます。JCacheからのCoherence固有の機能の使用を参照してください。

パススルー・キャッシュの作成

アプリケーションは、パススルー・キャッシュを使用してすべてのキャッシュ操作を既存のCoherenceキャッシュに委任できます。パススルー・キャッシュを使用すると、Coherence固有のNamedCacheインスタンスをJCacheインタフェースから使用することになります。パススルー・キャッシュによって、アプリケーションはすべてのCoherence固有の機能および構成をフル活用できます。

パススルー・キャッシュを作成するためには、アプリケーションはCoherenceのPassThroughCacheConfiguration JCache構成オブジェクトを使用し、Coherenceキャッシュ構成ファイルで定義されている既存のキャッシュ・マッピングの名前を指定することができます。たとえば:

...
CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();

PassThroughCacheConfiguration<String, Object> config = 
   new PassThroughCacheConfiguration<String, Object>();
config.setTypes(String.class, Object.class);

Cache<String, Object> cache = cacheManager.createCache("MyCache", config);

代替として、既存のJCacheアプリケーションではMutableConfigurationオブジェクトを使用し続けて、coherence.jcache.configuration.classnameプロパティを指定してその値をpassthroughに設定することで、パススルー・キャッシュを作成することができます。たとえば:

-Dcoherence.jcache.configuration.classname=passthrough

システム・プロパティにより、JCacheアプリケーションはアプリケーション・コードを変更することなくCoherenceネイティブ機能を使用することができます。ただし、ほとんどのMutableConfigurationオブジェクト・プロパティは無視されます。システム・プロパティを使用してパススルー・キャッシュを作成すると、警告メッセージが出力されます。

WARNING: Lossy conversion of configuration javax.cache.configuration.MutableConfiguration to a PassThroughConfiguration. 
Most properties from class javax.cache.configuration.MutableConfiguration are 
ignored. Configure PassThroughCache using native Coherence configuration 
methodologies.

オペレーション構成

JCache用のパススルー・キャッシュは、tangosol-coherence-override.xmlオペレーション・オーバーライド・ファイルおよびCoherenceシステム・プロパティのいずれかまたは両方を使用してCoherenceオペレーション設定を構成します。とりわけこのオペレーション設定によって、アプリケーションは既存のクラスタへ参加できるようになります。オペレーション構成ファイルの指定を参照してください。

キャッシュ構成

JCache用のパススルー・キャッシュは、既存のCoherenceキャッシュ構成ファイルを使用します。アプリケーションは、実行時にcoherence.cacheconfigプロパティを使用してファイルの場所を指定できます。たとえば:

-Dcoherence.cacheconfig=my-cache-config.xml

前述の方法によってキャッシュ・マネージャが使用するデフォルトURIが変更され、指定されたキャッシュ構成ファイルが取得されます。JCache APIを使用し、システム・プロパティの設定に依存せずにキャッシュ構成を指定する別の方法は、キャッシュ・マネージャを作成する際にURIを指定する方法です。たとえば:

Caching.getCacheManager(new URI(my-cache-config.xml), null, null);

前述の方法で返されたキャッシュ・マネージャから作成されたすべてのキャッシュは、getCacheManagerの呼出しで指定されたキャッシュ構成ファイルを使用します。キャッシュ構成ファイルの指定を参照してください。

リモート・キャッシュの作成

アプリケーションは、リモートのCoherenceパーティション・キャッシュにデータをキャッシュできます。アプリケーション・プロセスは、クラスタ上のCoherenceプロキシ・サービスに接続し、Coherenceはクラスタ全体のデータの分散およびバックアップを管理します。リモート・キャッシュは、Coherence*Extendに依存します。Oracle Coherenceリモート・クライアントの開発Coherence*Extendの概要を参照してください。リモート・キャッシュはいかなるアプリケーションのコードの変更も必要としないため、既存のJCacheアプリケーションは簡単にCoherenceリモート・キャッシュを使用するように移行できます。

リモート・キャッシュを作成するには、tangosol.coherence.jcache.configuration.classnameプロパティにremoteを使用します。たとえば:

-Dcoherence.jcache.configuration.classname=remote

リモート・キャッシュにより、jcache-extend-tcpという名前のリモート・キャッシュ・スキームにマップされるjcache-extend-*キャッシュ名を使用するCoherence NamedCacheのインスタンスが作成されます。キャッシュは、TCPProxyServiceという名前のプロキシ・サービスを使用してクラスタに接続するように構成されます。

オペレーション構成

JCacheアプリケーションは、必要に応じて、tangosol-coherence-override.xmlオペレーション・オーバーライド・ファイルおよびCoherenceシステム・プロパティのいずれかまたは両方を使用して、Coherenceオペレーション設定を構成する必要があります。オペレーション構成ファイルの指定を参照してください。

キャッシュ構成

JCache用のリモート・キャッシュは、coherence-jcache.jarライブラリに含まれるデフォルトのCoherenceキャッシュ構成ファイルを自動的に使用します。この構成ファイルの名前はcoherence-jcache-extendclient-cache-config.xmlです。さらに、クラスタ内の少なくとも1つのキャッシュ・サーバーが、プロキシ・サービスを定義するcoherence-jcache-server-proxy-cache-config.xmlファイルを使用する必要があります。たとえば、キャッシュ・サーバーはcoherence.cacheconfigシステム・プロパティを使用して明示的にキャッシュ構成ファイルを設定できます。

-Dcoherence.cacheconfig=coherence-jcache-server-proxy-cache-config.xml

既存のCoherenceキャッシュ構成ファイルの使用も選択できます。JCacheからのCoherence固有の機能の使用を参照してください。

JCacheからのCoherence固有の機能の使用

Coherence JCacheプロバイダによって、アプリケーションはCoherence固有の機能を使用できます。Coherence固有の機能を使用するアプリケーションには、JCacheプロバイダ間の移植性はありません。一般的に、アプリケーションは既存のCoherenceの実装および構成を再利用するために固有の機能を使用します。

この項には次のトピックが含まれます:

JCacheからのNamedCacheインスタンスへのアクセス

JCacheアプリケーションは、キャッシュの基礎となるCoherence NamedCacheインスタンスに直接アクセスできます。NamedCacheとJCache APIを入れ替えて使用することによってキャッシュに直接アクセスすることはできません。さらに、NamedCacheインスタンスを使用してキャッシュのキーおよび値にアクセスすると、Coherence JCacheプロバイダ実装によって提供される追加の動作はバイパスされます。

次の例は、JCacheキャッシュの基礎となるNamedCacheインスタンスに直接アクセスし、エントリの挿入および取得を行うためにインスタンスを使用しています。

CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();

MutableConfiguration<String, String> config = 
   new MutableConfiguration<String, String>();
config.setStoreByValue(true).setTypes(String.class, String.class);

Cache<String, String> cache = cacheManager.createCache("MyCache", config);

String key = "k";
String value = "Hello World";
        
NamedCache nc = cache.unwrap(NamedCache.class);
        
nc.put(key, value);

System.out.println("The value is " + nc.get(key) + "\n");

nc.destroy();
cacheManager.close();
JCacheでのCoherence構成の使用

JCacheに同等なものがないCoherence固有の概念(失効など)は、Coherenceキャッシュ構成ファイル、オペレーション・オーバーライド・ファイルまたはCoherenceシステム・プロパティを使用して構成できます。

ノート:

JCacheプロバイダ実装間で移植性を持つように設計されているアプリケーションは、JCache CompleteConfiguration APIが提供する構成のみに依存する必要があります。

既存のCoherenceキャッシュ構成ファイルをJCacheパーティションおよびローカル・キャッシュに使用する場合は、ファイルにjcacheネームスペース・ハンドラ定義を含める必要があります。たとえば:

<cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config"
   xmlns:jcache="class://com.tangosol.coherence.jcache.JCacheNamespace"
   xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-cache-config 
   coherence-cache-config.xsd">
   ...

JCacheネームスペース・ハンドラは、JCache固有のキャッシュ構成ファイルに必要なすべての欠落している要素を生成し、アプリケーションが標準キャッシュ構成ファイルを拡張できるようにします。すでにキャッシュ構成ファイルで定義されている場合、JCacheネームスペース・ハンドラは要素を生成しません。

Coherence JCacheキャッシュの構成

CoherenceのJCacheベースのキャッシュは、キャッシュが作成される際にMutableConfigurationクラスによってプログラムから構成されます。これは標準のJCacheクラスであり、JCacheプロバイダ間で移植性を維持するために使用する必要があります。たとえば:
MutableConfiguration<String, String> config = 
   new MutableConfiguration<String, String>();
config.setStoreByValue(true).setTypes(String.class, String.class);

Cache<String, String> cache = cacheManager.createCache("MyCache", config);

ローカルおよびパーティション・キャッシュを使用するアプリケーションは、オプションでJCache CompleteConfiguration APIのCoherence JCacheプロバイダ固有の実装を使用できます。この実装は、それぞれLocalCacheConfigurationおよびPartitionedCacheConfigurationです。ただし、これらのクラスはJCacheプロバイダ間の移植性はありません。たとえば:

PartitionedCacheConfiguration<String, String> config = 
   new PartitionedCacheConfiguration<String, String>();
config.setStoreByValue(true).setTypes(String.class, String.class);

パススルー・キャッシュを使用するアプリケーションには、Coherence JCacheプロバイダPassThroughCacheConfiguration構成クラスが必要です。パススルー・キャッシュはCoherence固有の構成を使用して構成されるため、JCache固有の構成オプションの使用はサポートしません。

PassThroughCacheConfiguration<String, String> config = 
   new PassThroughCacheConfiguration<String, String>();

この項には次のトピックが含まれます:

格納セマンティクスの設定

JCacheは、キャッシュが参照による格納と値による格納のどちらのセマンティクスを使用するかを指定するオプションを提供しています。setStoreByValueメソッドは、キーと値両方の格納セマンティクスを構成します。trueは値による格納セマンティクスを、falseは参照による格納セマンティクスを示します。Coherence JCacheプロバイダは、すべてのキャッシュ・タイプにおいてデフォルトで値による格納セマンティクスを使用し、ローカル・キャッシュにおいてのみ参照による格納をサポートしています。パーティション・キャッシュは参照による格納をサポートしていません。さらに、すべてのCoherence JCacheキャッシュ・タイプで、プロバイダは値による格納セマンティクスの実装にJavaシリアライズまたはPOFのどちらかを使用しています。ローカル・キャッシュで参照による格納を構成しているアプリケーションは、キーと値がシリアライズ可能またはPOFが有効化されている必要はありません。

次の例では、ローカル・キャッシュで参照による格納セマンティクスを使用するように構成しています。

CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();

MutableConfiguration<String, Integer> config = 
   new MutableConfiguration<String, Integer>();
config.setStoreByValue(false);

Cache<String, Integer> cache = cacheManager.createCache("MyCache", config);

ノート:

参照による格納が有効な場合は、キャッシュへの参照を保持しているスレッドによってキャッシュが変更される可能性があります。変更されたキーは取得できない可能性があります。さらに、Javaのパーミッションが正しく設定されていない場合は、JVM内のすべてのスレッドが変更された値を監視できる可能性があります。ローカル・ヒープを超えるとエントリはある形式に変換され、この変換以後に発生した変更はキャッシュに反映されない可能性があります。

キャッシュ・エントリの型の設定

JCacheでは、エントリのキーと値の型を設定できます。その後、キャッシュに配置されるすべてのエントリは、宣言された型に従う必要があります。そうでない場合は、ランタイム例外が発生します。setTypesメソッド(nullの設定は不可)が、エントリの型を構成するために使用されます。次の例では、キーの型をStringに、値の型をIntegerに設定しています。

CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();

MutableConfiguration<String, Integer> config = 
   new MutableConfiguration<String, Integer>();
config.setTypes(String.class, Integer.class);

Cache<String, Integer> cache = cacheManager.createCache("MyCache", config);

ノート:

Coherence JCache実装では、キャッシュを変更する操作に渡されるオブジェクトが、javax.cache.configuration.Configuration APIで構成された内容と一致することを確認する実行時チェックは行われません。アプリケーションはキャッシュを操作するためにジェネリクスを使用し、コンパイル時の静的なチェックを活用する必要があります。

型が構成されていない場合、デフォルトのキーと値の型はObject.classです。デフォルトの型を使用するか、または明示的にObject.class型を構成した場合、実行時の型チェックは無効になり、アプリケーションは任意のキーまたは値の型を使用できるようになります。ただし、その場合は、型の安全性の保証はアプリケーションの責任です。次の例では、明示的にキーと値のタイプをObject.classに設定し、キャッシュを取得する際の型パラメータを省略することによって、型チェックを無効化しています。

CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();

MutableConfiguration<Object, Object> config = 
   new MutableConfiguration<Object, Object>();
config.setStoreByValue(true).setTypes(Object.class, Object.class);

Cache<Object, Object> cache = cacheManager.getCache("MyCache");

必須ではありませんが、前述の例はコンパイル時の型チェックも使用しています。省略された場合、コンパイラは型の安全性をチェックしません。次の例では、コンパイル時と実行時の両方の型チェックを無効化しています。

MutableConfiguration config = new MutableConfiguration();
cacheManager.createCache("MyCache", config);

キャッシュ失効の設定

JCacheでは、エントリがキャッシュの中で使用可能な時間を構成できます。失効したエントリは有効ではなく、アプリケーションが使用することはできません。

ノート:

Coherence JCacheプロバイダは、最大キャッシュ容量に到達している場合、失効する予定がないエントリを削除する可能性があります。キャッシュ・エントリは、エントリのアクセス頻度および最終アクセス日時の組合せに基づくデフォルトのエビクション・ポリシーによって削除されます。アクセス頻度が最も低いエントリおよびアクセスされていない期間が最も長いエントリが最初に削除されます。

失効は、失効ポリシーおよび時間値を選択するsetExpiryPolicyFactoryメソッドを使用して構成されます。次の例では、キャッシュ内のエントリを作成されてから5分で失効するように構成しています。

CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();

MutableConfiguration<String, Integer> config = 
   new MutableConfiguration<String, Integer>();
config.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(
   Duration.FIVE_MINUTES));

Cache<String, Integer> cache = cacheManager.createCache("MyCache", config);

ポリシーがnullに設定されるか、失効が構成されていない場合、デフォルトで永続ポリシーが使用され、エントリは失効しません。各ポリシーでは、キャッシュ・エントリが失効とみなされる前に経過する必要がある期間を指定できます。便宜上、ZEROONE_MINUTEFIVE_MINUTESTEN_MINUTESTWENETY_MINUTESTHIRTY_MINUTESONE_HOURおよびONE_DAYという定義済の期間が提供されています。任意の負でない期間の値を構成できます。

次の失効ポリシーがサポートされています:

  • 作成 – キャッシュ・エントリは、作成日時に基づいて失効します。更新によって失効日時がリセットされることはありません。このポリシーは、JCacheのCreatedExpiryPolicyクラスで実装されています。

  • アクセス – キャッシュ・エントリは、最終アクセス日時に基づいて失効します。アクセスには、キャッシュの更新は含まれません。このポリシーは、JCacheのAccessedExpiryPolicyクラスで実装されています。

  • 変更 – キャッシュ・エントリは、最終更新日時に基づいて失効します。更新には、エントリの作成および変更(更新)が含まれます。このポリシーは、JCacheのModifiedExpiryPolicyクラスで実装されています。

  • タッチ – 最後にタッチされた日時に基づくキャッシュ・エントリです。タッチには、作成、更新またはアクセスが含まれます。このポリシーは、JCacheのTouchedExpiryPolicyクラスで実装されています。

  • 永続(デフォルト) – キャッシュ・エントリは失効しません。このポリシーは、JCacheのEternalExpiryPolicyクラスで実装されています。

失効ポリシーおよび期間は、分散キャッシュ・シナリオをサポートするためにシリアライズされる必要があります。Coherence JCacheプロバイダはシリアライズにPortable Object Format (POF)を使用し、プロバイダには失効タイプ用のPOFシリアライザが含まれています。パーティション・キャッシュがパススルー・キャッシュとともに使用されている場合は、Coherence JCacheプロバイダがこれらのタイプを使用できるように構成する必要があります。JCache POF構成ファイルの構成を参照してください。

リードスルーおよびライトスルー・キャッシングの有効化

リードスルーおよびライトスルー・キャッシングを使用すると、アプリケーションはデータ・ソースからキャッシュへのデータのロードや、キャッシュからデータ・ソースへのデータの書込みができるようになります。データ・ソースはデータベースと統合するのが最も一般的ですが、すべてのデータ・ソースはJCacheのキャッシュと統合できます。リードスルーおよびライトスルー・キャッシングはデフォルトでは有効でなく、JCacheのCacheLoaderおよびCacheWriterインタフェースそれぞれにアプリケーション固有の実装が必要となります。

リードスルーおよびライトスルー・キャッシングを有効にするには、setReadThroughおよびsetWriteThroughメソッドをそれぞれtrueに設定します。たとえば:

CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();

MutableConfiguration<String, Integer> config = 
   new MutableConfiguration<String, Integer>();
config.setReadThrough(true).setWriteThrough(true);

Cache<String, Integer> cache = cacheManager.createCache("MyCache", config);

CacheLoaderおよびCacheWriterの実装を登録するには、それぞれsetCacheLoaderFactoryおよびsetCacheWriterFactoryメソッドを使用し、実装クラスの完全修飾名を入力します。たとえば:

cacheWriter = new MyCacheWriter();
cacheLoader = new MyCacheLoader();

MutableConfiguration<String, Integer> config = 
   new MutableConfiguration<String, Integer>();
config.setReadThrough(true).setWriteThrough(true)
   .setCacheWriterFactory(FactoryBuilder.factoryOf(cacheWriter));
   .setCacheLoaderFactory(FactoryBuilder.factoryOf(cacheLoader));

Cache<String, Integer> cache = cacheManager.createCache("MyCache", config);

この実装は、あるキャッシュ操作を行った際に自動的に使用されます。詳細は、リードスルーおよびライトスルー・キャッシングの使用を参照してください。

管理の有効化

JCacheは、CacheMXBeanおよびCacheStatisticsMXBeanという2つの動的MBeanを提供しています。CacheMXBean MBeanは、キャッシュの構成設定を表示します。CacheStatisticsMXBean MBeanは、キャッシュのパフォーマンス統計を表示します。JCache管理情報の表示を参照してください。

管理はデフォルトで無効になっています。管理情報を有効化するには、キャッシュを構成する際にsetManagementEnabledおよびsetStatisticsEnabledメソッドをtrueに設定します。たとえば:

CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();

MutableConfiguration config = new MutableConfiguration();
config.setManagementEnabled(true).setStatisticsEnabled(true);

Cache cache = cacheManager.createCache("MyCache", config);

管理は、実行時にキャッシュ・マネージャを使用して有効化することもできます。

CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();

MutableConfiguration config = new MutableConfiguration();

Cache cache = cacheManager.createCache("MyCache", config);

cacheManager.enableManagement("MyCache", true);
cacheManager.enableStatistics("MyCache", true);

キャッシュ操作の実行

JCacheには、キャッシュとやりとりを行う多くの操作が含まれています。これらの操作は、javax.cache.Cacheインタフェースで定義されています。すべての使用可能なJCacheの操作のセマンティクスおよび詳細は、Cache APIドキュメントを参照してください。

キャッシュ操作を行う前に、まずキャッシュの作成および構成を行う必要があります。次の例では、単純なputおよびget操作を実行します:

ノート:

キーと値はnullにはできません。

CachingProvider provider = Caching.getCachingProvider();
CacheManager cacheManager = provider.getCacheManager();

MutableConfiguration config = new MutableConfiguration();

Cache cache = cacheManager.createCache("MyCache", config);

cache.put("k1", "Hello World");
System.out.println("The value is " + cache.get("k1")+ "\n");

前述の例では、コンパイル時または実行時のエントリの型チェックは行われません。キャッシュ・エントリの型の設定を参照してください。

CoherenceのJCache操作の理解

キャッシュ操作の実装は、LocalCachePartitionedCacheおよびPassThroughCacheの各キャッシュ・タイプによって異なります。たとえば、パーティション・キャッシュの操作は、Coherenceのデータ・シリアライズの利点を活用できるCoherenceエントリ・プロセッサによって実装されています。各キャッシュ・タイプは、使用するキャッシュ・トポロジの利点を活用できるキャッシュ操作の実装を提供しています。

リードスルーおよびライトスルー・キャッシングの使用

JCacheは、キャッシュと外部リソースを統合するために、リードスルーおよびライトスルー・キャッシングの使用をサポートしています。
リードスルー・キャッシングを使用するとエントリが自動的に外部リソースからロードされ、ライトスルー・キャッシングを使用するとエントリが自動的に外部リソースに書き込まれます。リードスルーおよびライトスルー・キャッシングでは、アプリケーションがそれぞれJCacheのCacheLoaderおよびCacheWriterインタフェースを実装している必要があります。リードスルーおよびライトスルー・キャッシングは、デフォルトでは有効になっていません。詳細は、リードスルーおよびライトスルー・キャッシングの有効化を参照してください。

ノート:

Coherenceパススルー・キャッシュを使用するアプリケーションは、Coherenceでリードスルーおよびライトスルー・キャッシングをネイティブに使用でき、JCache固有のローダーおよびライターの実装を含める必要はありません。

この項には次のトピックが含まれます:

リードスルー実装の提供

リードスルー・キャッシングを使用するには、アプリケーションはCacheLoaderインタフェースを実装する必要があります。実装の詳細は、使用する外部リソースに固有です。CacheLoaderメソッドの実装の詳細は、JCache APIドキュメントを参照してください。

CacheLoaderインタフェースは、loadおよびloadAllメソッドを提供しています。これらのメソッドは、実装が外部リソースに接続してそこから値または一連の値を取得するために必要なロジックを含める目的で使用されます。getgetAllgetAndRemoveまたはgetAndReplace操作の結果、指定されたキーのエントリが見つからない場合にキャッシュ・ローダーの実装が毎回自動的に起動されます。エントリ・プロセッサを使用し、そのエントリ・プロセッサがgetValueメソッドを使用する場合、invokeおよびinvokeAll操作によって自動的にキャッシュ・ローダーが使用されます。JCacheエントリの処理を参照してください。

キャッシュの事前ロード

Cache APIには、キャッシュの事前ロードに使用されるCache.loadAllメソッドが含まれています。このメソッドを使用すると、CacheLoader実装のloadAllメソッドが呼び出されます。この場合でもCacheLoaderの実装はキャッシュ上で構成される必要がありますが、リードスルー・キャッシングが有効化されている必要はありません。たとえば:

cacheLoader = new MyCacheLoader();

MutableConfiguration<String, String> config = 
   new MutableConfiguration<String, String>();
config.setTypes(String.class, String.class)
   .setReadThrough(false)
   .setCacheLoaderFactory(FactoryBuilder.factoryOf(cacheLoader));

前述の例では、factoryOfメソッドはMyCacheLoaderの実装のインスタンスを受け取っています。このメソッドは、状態を持ち実装クラスがシリアライズ可能である必要がある実装に使用されます。実装に状態がない場合は、かわりにfactoryOf(Class)またはfactoryOf(String classname)メソッドを使用することをお薦めします。

外部リソースからのキャッシュのロードが完了するまでには、長い時間がかかる可能性があります。CompletionListenerインタフェースを使用すると、アプリケーションはキャッシュがロードされた場合またはキャッシュのロード時に例外が発生した場合に通知を受けることができます。CompletionListenerFutureクラスは、必要に応じて使用できるデフォルトの実装です。たとえば:

cacheLoader = new MyCacheLoader();

MutableConfiguration<String, String> config = 
   new MutableConfiguration<String, String>();
config.setTypes(String.class, String.class)
   .setReadThrough(false)
   .setCacheLoaderFactory(FactoryBuilder.factoryOf(cacheLoader));
Cache<String, String> cache = cacheManager.createCache("MyCache", config);

CompletionListenerFuture future = new CompletionListenerFuture();

cache.loadAll(keys, true, future);

ライトスルー実装の提供

ライトスルー・キャッシングを使用するには、アプリケーションはCacheWriterインタフェースを実装する必要があります。実装の詳細は、使用する外部リソースに固有です。CacheWriterメソッドの実装の詳細は、JCache APIドキュメントを参照してください。

CacheWriterインタフェースは、エントリを外部リソースに書き込むメソッド(writeおよびwriteAll)および外部リソースからエントリを削除するメソッド(deleteおよびdeleteAll)を提供しています。これらのメソッドは、実装が外部リソースに接続してそのデータを更新するために必要なロジックを含める目的で使用されます。キャッシュ・ライターの実装は、putputAllputIfAbsentremoveremoveAllreplacegetAndPutgetAndRemovegetAndReplaceinvokeおよびinvokeAllのキャッシュ操作が行われると、毎回自動的に起動されます。

JCache POF構成ファイルの構成

Coherence JCacheプロバイダは、シリアライズにPOFを使用し、coherence-pof-config.xmlファイルを必要とします。JCache固有のPOFタイプは、coherence-jacache.jar\coherence-jcache-pof-config.xml POF構成ファイルで定義されています。パーティション・キャッシュをパススルー・キャッシュとともに使用している場合、POF構成ファイルの一部にJCache POFタイプが含まれている必要があります。たとえば:

<pof-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://xmlns.oracle.com/coherence/coherence-pof-config"
   xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-pof-config
   coherence-pof-config.xsd">
   <user-type-list>
       <include>coherence-pof-config.xml</include>
       <include>coherence-jcache-pof-config.xml</include>
...

POF構成ファイルの指定を参照してください。

JCache管理情報の表示

CacheMXBeanおよびCacheStatisticsMXBean JMX MBeanを使用して収集されたCoherence JCacheおよび管理データの管理について学習します。

この項には次のトピックが含まれます:

JCache管理情報の概要

Coherence JCacheプロバイダは、CacheMXBeanおよびCacheStatisticsMXBeanの両方の動的MBeanインタフェースを実装しています。このインタフェースは、次の管理情報を提供します:

  • CacheMXBean – キャッシュの構成情報を報告します。各構成オプションおよび現在の設定が、属性としてリストされます。

  • CacheStatisticsMXBean – キャッシュのパフォーマンス情報を報告します。パフォーマンス統計は属性としてリストされ、キャッシュで発生する可能性がある問題のトラブルシューティングに使用できます。

管理情報は、デフォルトでは有効化されていません。管理の有効化を参照してください。

ノート:

パススルー・キャッシュの管理情報は、Coherence固有のJMX管理の実装を使用して報告されます。Oracle Coherenceの管理JMXを使用したOracle Coherenceの管理を参照してください。

Coherence JCache MBean

管理情報は、JDK (JDK_HOME/bin/jvisualvm)に含まれているJava VisualVMコンソールなどのすべてのJMX MBean対応のブラウザで表示できます。ローカルおよびパーティション・キャッシュの管理MBeanは、デフォルトのMBeanサーバーに登録され、javax.cacheのJMXブラウザ内にあります。

Coherence-Java VisualVMプラグイン

JCache管理情報はCoherence-Java VisiualVMプラグインを使用して表示することができます。プラグインには、経時的な管理情報を集計し、構成およびパフォーマンスの問題のトラブルシューティングに使用するJCacheタブが含まれています。Oracle Coherenceの管理Coherence-JVisualVMプラグインを使用したCoherenceクラスタのモニターを参照してください。

Coherenceレポート

JCache管理情報はCoherenceレポートを使用して表示することもできます。Coherence JCacheレポートは、経時的な管理情報を集計し、構成およびパフォーマンスの問題のトラブルシューティングに使用されます。Oracle Coherenceの管理JCache構成レポートの理解およびJCache統計レポートの理解を参照してください。

JCache CacheConfiguration MBeanの理解

CoherenceCacheMXBeanクラスはCacheMXBeanインタフェースを実装し、キャッシュの構成情報を提供します。MBeanオブジェクトは各キャッシュに登録されます。MBeanのオブジェクト名は次のようになります。

javax.cache:type=CacheConfiguration,CacheManager=coherence-jcache-cache-config.xml,Cache=cache_name

この項には次のトピックが含まれます:

JCache CacheConfiguration MBeanの属性

表35-1に、CacheConfiguration MBeanの属性を示します。

表35-1 CacheConfiguration MBeanの属性

属性 アクセス 説明

KeyType

String

read-only

キャッシュが必要とするキーの型です。必要とされるキーの型が構成されていない場合のデフォルトの値は、java.lang.objectで、これは型チェックが無効になっていることを示します。

ManagementEnabled

Boolean

read-only

キャッシュの管理が有効化されているかどうかを示します。デフォルト値はfalseです。

ReadThrough

Boolean

read-only

キャッシュ操作がリードスルー・モードかどうかを示します。デフォルト値はfalseです。

StatisticsEnabled

Boolean

read-only

キャッシュのパフォーマンス統計が収集されているかどうかを示します。デフォルト値はfalseです。

StoreByValue

Boolean

read-only

キャッシュが値による格納または参照による格納のどちらのセマンティクスを使用しているかを示します。デフォルト値はtrueで、キーと値は値によって格納されることを示します。falseは、キーと値は参照によって格納されることを示します。

ValueType

String

read-only

キャッシュが必要とする値の型です。必要とされる値の型が構成されていない場合のデフォルトの値は、java.lang.objectで、これは型チェックが無効になっていることを示します。

WriteThrough

Boolean

read-only

キャッシュ操作がライトスルー・モードかどうかを示します。デフォルト値はfalseです。

JCache CacheConfiguration MBeanの操作

CacheConfiguration MBeanには、すべての構成管理情報をリセットするclear操作が含まれています。

JCache CacheStatistics MBeanの理解

Coherence JCacheプロバイダには、JCacheのCacheStatisticsMXBeanインタフェースの2つの実装が含まれています。ContextJCacheStatistics実装は、ローカル・キャッシュのパフォーマンス統計の収集に使用されます。PartitionedJCacheStatisticsは、Coherence内のすべての記憶域メンバーのパフォーマンス統計の収集および集計に使用されます。MBeanオブジェクトは各キャッシュに登録されます。MBeanのオブジェクト名は次のようになります。

javax.cache:type=CacheStatistics,CacheManager=coherence-jcache-cache-config.xml,Cache=cache_name

この項には次のトピックが含まれます:

JCache CacheStatistics MBeanの属性

表35-2に、CacheStatistics MBeanの属性を示します。

表35-2 キャッシュ統計属性

属性 アクセス 説明

AverageGetTime

Float

read-only

get操作を行う平均時間です。リードスルー・キャッシュの場合、キャッシュ・ミスによるエントリのロードに必要な時間は含まれません。

AveragePutTime

Float

read-only

put操作を行う平均時間です。

AverageRemoveTime

Float

read-only

remove操作を行う平均時間です。

CacheEvictions

Long

read-only

キャッシュからのエビクションの総数です。エビクションは、スペースを開放するため、キャッシュによって開始されます。エビクションは、remove操作とはみなされません。

ノート: この属性は、Coherence JCacheプロバイダでは実装されていません。

CacheGets

Long

read-only

get操作の総数です。この値はヒットとミスの合計に等しく、キーの存在チェック操作は含みません。

CacheHitPercentage

Float

read-only

エントリを返したキャッシュ・リクエストの割合です。この割合は、キャッシュ・ヒットをキャッシュのget操作で割って計算され、10進値として報告されます。

CacheHits

Long

read-only

成功したget操作の回数です。

CacheMissPercentage

Float

read-only

エントリを返さなかったキャッシュ・リクエストの割合です。この割合は、キャッシュ・ミスをキャッシュのget操作で割って計算され、10進値として報告されます。

CacheMisses

Long

read-only

成功しなかったget操作の回数です。

CachePuts

Long

read-only

既存のエントリの置換操作を含むput操作の総数です。

CacheRemovals

Long

read-only

remove操作の総数です。スペースを開放するためにキャッシュによって開始されるエビクションは含みません。

JCache CacheStatistics MBeanの操作

CacheStatistics MBeanには、すべてのキャッシュ統計をリセットするclear操作が含まれています。

パーティション・キャッシュ統計のリフレッシュ間隔の変更

Coherence JCacheプロバイダは、パーティション・キャッシュのパフォーマンス統計のリフレッシュ・タイミングを決定するためにリフレッシュ間隔を使用します。リフレッシュは遅延して実行されます。統計は、リフレッシュ間隔に達して統計を取得する呼出しが行われた場合にのみリフレッシュされます。統計を取得する呼出しが行われない場合は、リフレッシュ間隔に達した場合でも統計はリフレッシュされません。

デフォルトのリフレッシュ間隔は3秒で、様々なクラスタ・サイズおよびネットワーク・パフォーマンスに対応するために変更できます。たとえば、多くの記憶域メンバーを持つクラスタでは、すべてのメンバーの統計の集計および恒常的な更新の回避のために、長いリフレッシュ間隔が必要かもしれません。

リフレッシュ間隔を変更するには、coherence.jcache.statistics.refreshtimeシステム・プロパティを使用して、時間をミリ秒で設定します。次の例では、リフレッシュ間隔を5秒に構成しています。

-Dcoherence.jcache.statistics.refreshtime=5000