この章では、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
この章には次の項が含まれます:
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 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管理情報の表示」を参照してください。
Coherence JCacheプロバイダは、Coherence固有のNamedCache
APIとともに、使用可能な多くの機能をサポートしています。ただし、JCacheを通してすべての機能を使用できるわけではありません。表33-1に、2つのAPIの比較を示します。
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プロバイダへの指定」を参照してください。
JCacheプロバイダは、Coherence固有のNamedCache APIと同じ構成ファイルを活用します。ただし、構成ファイルのカスタマイズは簡略化され、場合によってはまったく必要ないこともあります。次に、JCache実装によって使用される構成ファイルを示します。
tangosol-coherence-override.xml
– パーティション・キャッシュ用にCoherenceクラスタを構成する場合や、パススルー・キャッシュを使用する場合に、Coherenceオペレーション・オーバーライド・ファイルが使用されます。このオーバーライド・ファイルは、ローカル・キャッシュには必要ありません。オペレーション・オーバーライド・ファイルの詳細は、「オペレーション構成ファイルの指定」を参照してください。
coherence-jcache-cache-config.xml
– coherence-jcache-cache-cofig.xml
と呼ばれるCoherence JCacheプロバイダ固有のキャッシュ構成ファイルがプロバイダJARファイルに含まれ、ローカルおよびパーティション・キャッシュを作成するために使用されます。ただし、アプリケーションが構成を編集することは想定されていません。この中に含まれるキャッシュ構成ファイルでは、JCacheアプリケーションで使用するローカルおよびパーティション・キャッシュをプログラムによって定義する際に使用されるJCacheNamespace
ハンドラ・クラスが定義されています。
coherence-jcache-pof-cofig.xml
– coherence-jcache-pof-cofig.xml
と呼ばれるCoherence JCacheプロバイダ固有のPOF構成ファイルがプロバイダJARファイルに含まれ、JCache POFタイプを定義するために使用されます。既存のCoherenceアプリケーションにJCache POFタイプを含めることの詳細は、「JCache POF構成ファイルの構成」を参照してください。
この項では、初めてJCacheを使用する方を対象にJCacheの仕様およびAPIの概要を説明します。このマニュアルの手順を実行する際に必要となる基本的な概念も含みます。JCacheに精通している場合は、この項をスキップできます。
この項は、APIドキュメントや仕様書にかわるものではありません。詳細は、Java Community Process (JCP)のWebサイトからJCacheの仕様、Javaソース、JavaDocをダウンロードしてください。
https://www.jcp.org/en/jsr/detail?id=107
JCacheの仕様では、Javaプログラムでキャッシュを作成および使用するAPIが定義されています。多くの場合、アプリケーションは作成に大幅なコストがかかるリソースを格納および再利用するためにキャッシュを使用します。アプリケーションは、リソースの再作成に関連するコストをかけることなく高速にメモリ内のリソースにアクセスできます。一般的にアプリケーションは、パフォーマンス、可用性およびスケーラビリティを増加させるためにキャッシュを使用します。
JCache APIは、キャッシュ用にプロバイダ・ベースのモデルを定義します。プロバイダ・モデルは、キャッシュ・クライアントAPIをキャッシュ実装から分離させます。アプリケーションは明確に定義されたクライアントAPIを使用し、キャッシュ・プロバイダが実際のキャッシュの実装を担当しています。プロバイダ・ベースのモデルによって、アプリケーション開発者は複雑なキャッシュ・サブシステムの作成および管理から解放され、仕様を実装するキャッシュ・プロバイダ間の移植性が保証されます。
JCache APIは、CachingProvider
およびCacheManager
インタフェースを定義しています。アプリケーションは、CachingProvider
インタフェースを使用してキャッシュ・マネージャを取得および使用します。アプリケーションは、CacheManager
インタフェースを使用してキャッシュを作成および使用します。アプリケーションでは、複数のキャッシュ・プロバイダを自由に使用できます。ただし、キャッシュ・マネージャは単一のキャッシュ・プロバイダとのみ関連付けることができます。
JCacheは、キャッシュ・プロバイダを取得してキャッシュ・マネージャにアクセスするいくつかの方法を提供しています。このマニュアル全体で使用されている一般的なアクセス・パターンは、Caching
ブートストラップ・クラスを使用する方法です。このクラスはCachingPovider
実装を取得する便利な方法を提供し、自動的に標準Javaサービス定義を含むプロバイダを検出します。
次の例は、デフォルトのCachingProvider
実装を取得し、キャッシュ・マネージャを作成します。
CachingProvider cachingProvider = Caching.getCachingProvider(); CacheManager cacheManager = cachingProvider.getCacheManager();
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);
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);
JCache APIは、アプリケーションにキャッシュをカスタマイズする機能を付与する複数のインタフェースを提供しています。実装を使用するためには、Factory
インタフェースを使用してインスタンスを作成する必要があります。これによって、インスタンスがシリアライズ可能なことが保証されます。アプリケーションは、次のインタフェースを実装できます。
ExpiryPolicy
– このインタフェースは、エントリの作成、アクセスおよび変更操作に基づきキャッシュ・エントリがいつ失効するか(Duration
)を定義するために使用します。
CacheLoader
– このインタフェースは、外部リソースからデータをキャッシュにロードするために使用します。これは、リードスルー・キャッシングを使用する場合に必要になります。
CacheWriter
– このインタフェースは、データを外部リソースに書き込むするために使用します。これは、リードスルー・キャッシングを使用する場合に必要になります。
CacheEntryListener
– キャッシュ・イベントを受信し、それに反応するために使用されるサブインスタンスのセット(CacheEntryCreatedListener
、CacheEntryUpdatedListener
、CacheEntryRemovedListener
およびCacheEntryExpiredListener
)です。
EntryProcessor
– このインタフェースは、キャッシュ・エントリにアトミックでロック・フリーな複合操作を実行するために使用します。他のインタフェースとは異なり、EntryProcessor
インタフェースは、インスタンスの作成にFactory
インタフェースの使用を必要としませんが、分散キャッシュで使用する場合は、シリアライズできるような実装が必要となります。