プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Coherenceでのアプリケーションの開発
12c (12.2.1)
E69903-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

33 Coherence JCacheの概要

この章では、JSR-107 JCACHE - Java Caching API仕様の概要を説明します。通常、このドキュメントでは、この仕様およびAPIをJCacheと呼んでいます。JCacheの概要の項には、基本的なAPIの説明も含まれています。APIの詳細は、Java Community Process (JCP)のWebサイトからJCacheの仕様、Javaソース、JavaDocをダウンロードしてください。

https://www.jcp.org/en/jsr/detail?id=107

この章には次の項が含まれます:

33.1 Coherence JCache実装の概要

Coherenceには、JCacheプロバイダ実装(COHERENCE_HOME\lib\coherence-jcache.jar)が含まれています。JCacheは、Javaでキャッシュを使用する標準APIです。アプリケーション開発者はJCache API (javax.cache.*)を使用し、Coherenceは基礎となるキャッシュ機能を提供します。プロバイダ・ベースのアプローチを使用することによって、プロバイダ間の移植性が保証され、開発者は複雑なキャッシュ・システムの作成および管理ではなく、アプリケーション・ロジックに集中できるようになります。JCacheの詳細は、「JCache入門」を参照してください。

既存のCoherenceテクノロジを使用するCoherence JCacheプロバイダは、Coherence NamedCache APIのラッパーと考えることも可能です。これによって、CoherenceはJCacheインタフェースを通して多くの優れたテクノロジの再利用および公開ができるようになります。

サポートされているキャッシュ・タイプ

Coherence JCacheプロバイダは、次のキャッシュ・タイプを提供しています。

  • ローカル・キャッシュ – アプリケーション・プロセスにローカルなキャッシュです。ローカル・キャッシュに格納されるエントリは、アプリケーション・プロセスの終了後は永続化されません。ローカル・キャッシュは、local-schemeキャッシュ定義を使用して構成されるNamedCacheキャッシュに類似しています。ローカル・キャッシュの実装は、com.tangosol.coherence.jcache.localcacheパッケージで定義されています。ローカル・キャッシュの作成の詳細は、「ローカル・キャッシュの作成」を参照してください。

  • パーティション・キャッシュ – Coherenceクラスタ内の複数のプロセスにパーティション化(分散)されたキャッシュです。パーティション・キャッシュに格納されるエントリは、アプリケーション・プロセスの終了後にバックアップされ、クラスタ上に永続化されます。パーティション・キャッシュは、distributed-schemeキャッシュ定義を使用して構成されるNamedCacheキャッシュに類似しています。パーティション・キャッシュの実装は、com.tangosol.coherence.jcache.partitionedcacheパッケージで定義されています。パーティション・キャッシュの作成の詳細は、「パーティション・キャッシュの作成」を参照してください。パーティション・キャッシュの詳細は、「分散キャッシュの理解」を参照してください。

  • パススルー・キャッシュ – 既存のNamedCacheキャッシュに委任するキャッシュです。パススルー・キャッシュは、アプリケーションにすべてのCoherence固有の機能をJCacheインタフェースから使用する機能を提供します。パススルー・キャッシュは、JCacheに移行したいが既存のCoherenceアプリケーション・コンポーネントも再利用したいアプリケーションに理想的です。パススルー・キャッシュの実装は、com.tangosol.coherence.jcache.passthroughcacheパッケージで定義されています。パススルー・キャッシュの作成の詳細は、「パススルー・キャッシュの作成」を参照してください。

  • リモート・キャッシュ – プロキシ・サービスを介してパーティション・キャッシュに委任するキャッシュ。リモート・キャッシュは、クラスタへのアクセスがCoherence*Extendを介して実行される点を除いて、パーティション・キャッシュに類似しています。リモート・キャッシュは、Coherenceキャッシュは使用したいが、クラスタのメンバーになりたくない用途に最適です。リモート・キャッシュ実装はcom.tangosol.coherence.jcache.remoteパッケージに定義されています。リモート・キャッシュの作成の詳細は、「リモート・キャッシュの作成」を参照してください。

Coherence JCacheイベント

Coherence JCacheプロバイダは、Coherence固有のイベントAPIを使用してJCacheイベントを実装しています。ローカルおよびパーティション・キャッシュの実装は、Coherence MapListener APIを活用しています。パススルー・キャッシュの実装はJCacheイベントに直接マッピングするCoherence MapEventsのみをサポートし、JCacheの失効イベントはサポートしていません。各キャッシュ・タイプは、マップ・リスナーの登録とマップ・イベントのディスパッチを担当します。イベント・クラスは、各キャッシュ・タイプのパッケージに加え、com.tangosol.coherence.jcache.commonパッケージにもあります。JCacheイベントの作成や使用の詳細は、「JCacheイベントの使用」を参照してください。


注意:

  • Coherence MapListener APIには、javax.cache.event.CacheEntryExpiredListener APIと同等の機能はありません。

  • NamedCache.clearメソッドを使用するとCoherenceのMapListener.entryDeletedイベントが発生しますが、JCacheのCache.clearメソッドではイベントは発生しません。


Coherence JCacheエントリ・プロセッサ

Coherence JCacheプロバイダは、Coherence固有のInvocableMap.EntryProcessor APIを使用してJCacheエントリ・プロセッサを実装しています。各キャッシュ・タイプのprocessorsパッケージには、invokeまたはinvokeAllメソッドがキャッシュから呼ばれた際にJCacheエントリ・プロセッサの実行を管理するInvokeProcessorクラスが含まれています。JCacheエントリ・プロセッサの作成や使用の詳細は、「JCacheエントリの処理」を参照してください。

各キャッシュ・タイプのprocessorsパッケージには、キャッシュ操作の実行に使用される多くのCoherence固有のエントリ・プロセッサも含まれています。たとえば、パーティション・キャッシュを使用する場合、putメソッドはPutProcessorクラスで処理されます。

JCacheのためのCoherenceのシリアライズ

Coherence JCacheプロバイダはCoherence Portable Object Format (POF)シリアライズを使用します。POFは、Coherenceで実績のあるバイナリ形式で、スペースおよび時間の両面で効率的です。パーティションおよびパススルー・キャッシュでは、多くのキャッシュ操作にPOFが活用されています。キャッシュ構成、エントリ・プロセッサ、イベント・リスナーおよびフィルタ、JCache統計もPOFを使用しています。

POFは、JCache使用の一部で要求されるシリアライズにも使用されています。com.tangosol.coherence.jcache.serializationパッケージには、JCacheファクトリ・ビルダー、失効ポリシーおよびキャッシュ・エントリ・リスナー構成をサポートするPOFシリアライザ実装が含まれています。

アプリケーションは必要に応じてシリアライズにPOFを使用できますが、これはCoherence JCacheプロバイダを使用する際の要件ではありません。キャッシュ・プロバイダ間の移植性が必要な場合は、アプリケーションはJavaのシリアライズを使用する必要があります。

Coherence JCacheの管理

Coherence JCacheプロバイダは、JCacheのCacheMXBeanおよびCacheStatisticsMXBean MXBeanインタフェースを実装しています。実装は、com.tangosol.coherence.jcache.commonパッケージにあります。ローカルおよびパーティション・キャッシュの管理情報は、デフォルトのMBeanサーバーに登録され、javax.cacheネームスペース内にあります。パススルー・キャッシュの管理情報は、Coherence固有のJMX管理の実装を使用して報告されます。JCacheの管理の有効化の詳細は、「JCache管理情報の表示」を参照してください。

33.2 JCacheとNamedCacheの機能比較

Coherence JCacheプロバイダは、Coherence固有のNamedCache APIとともに、使用可能な多くの機能をサポートしています。ただし、JCacheを通してすべての機能を使用できるわけではありません。表33-1に、2つのAPIの比較を示します。

表33-1 JCacheとNamedCacheの機能比較

機能 JCache NamedCache

ローカル・キャッシュ

パーティション(分散)キャッシュ

レプリケート・キャッシュ


オプティミスティック・キャッシュ


ニア・キャッシュ


リードスルー

ライトスルー

イベント

問合せフィルタ


索引


エントリ・プロセッサ

集計



33.3 Coherence JCacheの依存性

JCacheおよびCoherence JCacheプロバイダを使用するアプリケーションのクラスパスには、次のライブラリを含める必要があります。

  • COHERENCE_HOME\lib\cache-api.jar – 標準JCache API

  • COHERENCE_HOME\lib\coherence-jcache.jar – Coherence JCacheプロバイダ実装

  • COHERENCE_HOME\lib\coherence.jar – コアCoherenceライブラリ

Coherence JCacheプロバイダでは、coherence-jcache.jarライブラリのMETA-INF/servicesディレクトリにサービス定義が含まれています。この定義によって、javax.cache.Cachingブートストラップ・クラスを使用するアプリケーションがCoherenceを自動的にロードし、デフォルトのキャッシュ・プロバイダとして使用できるようになります。CoherenceのデフォルトJCacheプロバイダとして使用の詳細は、「CoherenceのJCacheプロバイダへの指定」を参照してください。

33.4 Coherence JCacheプロバイダの構成の概要

JCacheプロバイダは、Coherence固有のNamedCache APIと同じ構成ファイルを活用します。ただし、構成ファイルのカスタマイズは簡略化され、場合によってはまったく必要ないこともあります。次に、JCache実装によって使用される構成ファイルを示します。

  • tangosol-coherence-override.xml – パーティション・キャッシュ用にCoherenceクラスタを構成する場合や、パススルー・キャッシュを使用する場合に、Coherenceオペレーション・オーバーライド・ファイルが使用されます。このオーバーライド・ファイルは、ローカル・キャッシュには必要ありません。オペレーション・オーバーライド・ファイルの詳細は、「オペレーション構成ファイルの指定」を参照してください。

  • coherence-jcache-cache-config.xmlcoherence-jcache-cache-cofig.xmlと呼ばれるCoherence JCacheプロバイダ固有のキャッシュ構成ファイルがプロバイダJARファイルに含まれ、ローカルおよびパーティション・キャッシュを作成するために使用されます。ただし、アプリケーションが構成を編集することは想定されていません。この中に含まれるキャッシュ構成ファイルでは、JCacheアプリケーションで使用するローカルおよびパーティション・キャッシュをプログラムによって定義する際に使用されるJCacheNamespaceハンドラ・クラスが定義されています。

  • coherence-jcache-pof-cofig.xmlcoherence-jcache-pof-cofig.xmlと呼ばれるCoherence JCacheプロバイダ固有のPOF構成ファイルがプロバイダJARファイルに含まれ、JCache POFタイプを定義するために使用されます。既存のCoherenceアプリケーションにJCache POFタイプを含めることの詳細は、「JCache POF構成ファイルの構成」を参照してください。

33.5 JCache入門

この項では、初めてJCacheを使用する方を対象にJCacheの仕様およびAPIの概要を説明します。このマニュアルの手順を実行する際に必要となる基本的な概念も含みます。JCacheに精通している場合は、この項をスキップできます。

この項は、APIドキュメントや仕様書にかわるものではありません。詳細は、Java Community Process (JCP)のWebサイトからJCacheの仕様、Javaソース、JavaDocをダウンロードしてください。

https://www.jcp.org/en/jsr/detail?id=107

33.5.1 JCacheとは

JCacheの仕様では、Javaプログラムでキャッシュを作成および使用するAPIが定義されています。多くの場合、アプリケーションは作成に大幅なコストがかかるリソースを格納および再利用するためにキャッシュを使用します。アプリケーションは、リソースの再作成に関連するコストをかけることなく高速にメモリ内のリソースにアクセスできます。一般的にアプリケーションは、パフォーマンス、可用性およびスケーラビリティを増加させるためにキャッシュを使用します。

JCache APIは、キャッシュ用にプロバイダ・ベースのモデルを定義します。プロバイダ・モデルは、キャッシュ・クライアントAPIをキャッシュ実装から分離させます。アプリケーションは明確に定義されたクライアントAPIを使用し、キャッシュ・プロバイダが実際のキャッシュの実装を担当しています。プロバイダ・ベースのモデルによって、アプリケーション開発者は複雑なキャッシュ・サブシステムの作成および管理から解放され、仕様を実装するキャッシュ・プロバイダ間の移植性が保証されます。

33.5.2 JCacheキャッシュ・プロバイダおよびキャッシュ・マネージャ

JCache APIは、CachingProviderおよびCacheManagerインタフェースを定義しています。アプリケーションは、CachingProviderインタフェースを使用してキャッシュ・マネージャを取得および使用します。アプリケーションは、CacheManagerインタフェースを使用してキャッシュを作成および使用します。アプリケーションでは、複数のキャッシュ・プロバイダを自由に使用できます。ただし、キャッシュ・マネージャは単一のキャッシュ・プロバイダとのみ関連付けることができます。

JCacheは、キャッシュ・プロバイダを取得してキャッシュ・マネージャにアクセスするいくつかの方法を提供しています。このマニュアル全体で使用されている一般的なアクセス・パターンは、Cachingブートストラップ・クラスを使用する方法です。このクラスはCachingPovider実装を取得する便利な方法を提供し、自動的に標準Javaサービス定義を含むプロバイダを検出します。

次の例は、デフォルトのCachingProvider実装を取得し、キャッシュ・マネージャを作成します。

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

33.5.3 JCacheキャッシュ

JCache APIは、Cacheインタフェースを定義しています。Cacheインタフェースは、キーと値のペアを格納するデータ構造を作成します。それぞれのキーと値のペアはエントリと呼ばれ、Cache.Entryインタフェースで定義されます。キャッシュはJava Mapデータ構造に類似していますが、いくつかの主要な相違点があります。

  • キーまたは値はNULLであってはいけません。

  • Cache.put操作は、エントリの以前の値を返しません。Map.put操作と機能的に同等なのは、Cache.getAndPut操作です。

  • キャッシュ・エントリは、失効して削除される可能性があります。

  • 値は、リードスルーおよびライトスルー・キャッシングをサポートするために、自動的に外部ソースからロードされたり、自動的に外部ソースに書き込まれる可能性があります。

  • キャッシュ・エントリの変更を監視できます。

  • キャッシュ統計を収集できます。

Cacheインタフェースには、キャッシュ・エントリの挿入、取得、置換および削除のためのメソッドが含まれています。キャッシュのロード、キャッシュ・リスナーの登録、およびエントリ・プロセッサの起動のためのメソッドも提供されています。

次の例は、キャッシュ・マネージャを使用してMyCacheというCacheインスタンスを作成する方法を示しています。

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

JCacheは、ジェネリクスを使用してコンパイル時および実行時の両方で型チェックをサポートしています。この例では、String型であるキーおよびInteger型である値を必要とするキャッシュを作成しています。必須ではありませんが、型チェックを行うことをお薦めします。

キャッシュ・インスタンスは、次のように操作します:

String key = "k";
Integer value = 1;

cache.put(key, value);

33.5.4 JCacheキャッシュ構成

JCache APIは、キャッシュの構成に使用するCompleteConfigurationインタフェースを定義しています。MutableConfigurationクラスがこのインタフェースのデフォルトの実装です。構成オプションには、次のものがあります:

  • 格納セマンティクスの設定(値による格納または参照による格納)

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

  • キャッシュ失効の設定

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

  • 管理および統計の有効化

キャッシュは作成の際に構成されます。前述のキャッシュの例では、createCacheメソッドがキャッシュの名前および構成の両方を要求していました。次の例は、createCacheメソッドで使用される構成オブジェクトの作成方法を示しています。

MutableConfiguration<String, Integer> config = 
   new MutableConfiguration<String, Integer>();
config.setStoreByValue(true).setTypes(String.class, Integer.class)
   .setReadThrough(true)
   .setWriteThrough(true)
   .setManagementEnabled(true)
   .setStatisticsEnabled(true)
   .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.FIVE_MINUTES));

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

33.5.5 JCacheカスタム・プログラミング

JCache APIは、アプリケーションにキャッシュをカスタマイズする機能を付与する複数のインタフェースを提供しています。実装を使用するためには、Factoryインタフェースを使用してインスタンスを作成する必要があります。これによって、インスタンスがシリアライズ可能なことが保証されます。アプリケーションは、次のインタフェースを実装できます。

  • ExpiryPolicy – このインタフェースは、エントリの作成、アクセスおよび変更操作に基づきキャッシュ・エントリがいつ失効するか(Duration)を定義するために使用します。

  • CacheLoader – このインタフェースは、外部リソースからデータをキャッシュにロードするために使用します。これは、リードスルー・キャッシングを使用する場合に必要になります。

  • CacheWriter – このインタフェースは、データを外部リソースに書き込むするために使用します。これは、リードスルー・キャッシングを使用する場合に必要になります。

  • CacheEntryListener – キャッシュ・イベントを受信し、それに反応するために使用されるサブインスタンスのセット(CacheEntryCreatedListenerCacheEntryUpdatedListenerCacheEntryRemovedListenerおよびCacheEntryExpiredListener)です。

  • EntryProcessor – このインタフェースは、キャッシュ・エントリにアトミックでロック・フリーな複合操作を実行するために使用します。他のインタフェースとは異なり、EntryProcessorインタフェースは、インスタンスの作成にFactoryインタフェースの使用を必要としませんが、分散キャッシュで使用する場合は、シリアライズできるような実装が必要となります。

33.5.6 JCacheの管理

JCache APIは、キャッシュの管理に使用される2つの動的なMBeanを定義しています。CacheMXBean MXBeanは、キャッシュ構成情報を報告します。CacheStatisticsMXBean MXBeanは、発生する可能性のある問題のトラブルシューティングに使用されるキャッシュ・パフォーマンス統計を報告します。動的なMBeanは実装に固有のMBeanサーバーとともに登録され、JMX MBean対応ブラウザの使用を含む標準JMXを使用して取得されます。