29 連続問合せキャッシングの使用
この章の内容は次のとおりです。
- 連続問合せキャッシングの使用の概要
連続問合せ機能では、問合せ結果を関連するイベントの連続的なストリームと結合し、リアルタイムに最新の問合せ結果を維持することが可能です。 - 連続問合せキャッシュのユース・ケースの理解
連続問合せキャッシュには、いくつかの一般的な用途のカテゴリがあります。 - 連続問合せキャッシュの実装の理解
Coherenceでの連続問合せの実装には、com.tangosol.net.cache.ContinuousQueryCache
クラスを使用します。 - 連続問合せキャッシュの構成
連続問合せキャッシュを使用する場合、定義する必要のある2つの項目があります。 - ContinuousQueryCacheに関連付けられているリソースのクリーンアップ
連続問合せキャッシュを短時間しか使用しない場合、アプリケーションではContinuousQueryCache
のrelease()
メソッドを明示的にコールする必要があります。 - キーのみのキャッシュまたはキーと値のキャッシュ
連続問合せキャッシュを構成する際、問合せで取得されたキーのみをキャッシュで追跡し、要求された場合にのみ、その値を基礎となるキャッシュから取得するように指定できます。 - 連続問合せキャッシュのリスニング
同期および非同期のイベント・リスナーを使用して、連続問合せキャッシュを監視できます。 - 連続問合せキャッシュを読取り専用にする
ContinuousQueryCache
は、読取り専用キャッシュにできます。
親トピック: データ・グリッド操作の実行
連続問合せキャッシングの使用の概要
連続問合せは、問合せの結果を連続問合せキャッシュにマテリアライズし、問合せでイベント・リスナーを使用してリアルタイムでキャッシュを最新の状態に保つことにより実装されます。つまり、連続問合せは、決して古くなることのない、キャッシュされた問合せ結果になります。
親トピック: 連続問合せキャッシングの使用
連続問合せキャッシュのユース・ケースの理解
-
これは、複合イベント処理(CEP: Complex Event Processing)システムやイベント相関エンジンにおける有用な構成要素です。
-
これは、アプリケーションが特定の問合せを繰り返し実行し、その問合せの最新の結果に常に即座にアクセスできることが有益である状況では、効果的です。
-
連続問合せキャッシュはマテリアライズド・ビューに類似しており、標準の
NamedCache
APIを使用して問合せの結果にアクセスし、操作する場合およびその問合せに関連するイベントの現行ストリームを受信する場合に役立ちます。 -
連続問合せキャッシュは、最新のデータ・セットを使用場所(特定のサーバー・ノードやクライアント・デスクトップなど)でローカルに保持できるため、ニア・キャッシュと同様の方法で使用できます。ニア・キャッシュは無効化ベースですが、連続問合せキャッシュでは実際にデータが最新の状態で保持されます。
使用例の1つにトレーディング・システム・デスクトップがあります。このデスクトップには、トレーダーの未処理の注文とすべての関連情報が常に最新の状態で保持されている必要があります。Coherence*Extend機能を連続問合せキャッシュと組み合せることにより、アプリケーションで何万もの同時ユーザーをサポートできます。
ノート:
連続問合せキャッシュは、分散される可能性のあるより大きなキャッシュ・データ・セットの特定のサブセットについて、その最新のローカル・コピーを非常に簡単かつ効果的に維持する機能を提供します。そのため、クライアントベースおよびサーバーベースのアプリケーションを含め、ほとんどすべてのタイプのアプリケーションに有用です。
親トピック: 連続問合せキャッシングの使用
連続問合せキャッシュの実装の理解
com.tangosol.net.cache.ContinuousQueryCache
クラスを使用します。このクラスは、Coherenceのすべてのキャッシュと同様、次の機能を備えた標準のNamedCache
インタフェースを実装します。
-
Map
インタフェースを使用したキャッシュのアクセスおよび操作:NamedCache
は、Java Collections Frameworkの標準的なMap
インタフェースを拡張します。これは、JavaのHashMap
クラスとHashtable
クラスで実装されているものと同じインタフェースです。 -
キャッシュ内で発生するすべてのオブジェクト変更に対するイベント:
NamedCache
はObservableMap
インタフェースを拡張します。 -
IDをベースとしたクラスタ全体でのキャッシュ内オブジェクトのロック:
NamedCache
はConcurrentMap
インタフェースを拡張します。 -
キャッシュ内オブジェクトの問合せ:
NamedCache
はQueryMap
インタフェースを拡張します。 -
キャッシュ内オブジェクトの分散パラレル処理および集約:
NamedCache
はInvocableMap
インタフェースを拡張します。
ContinuousQueryCache
は、Coherenceのすべてのキャッシュで提供されるAPIであるNamedCache
インタフェースを実装しているため、非常に使いやすく、その機能が必要になった場合に別のキャッシュと簡単に置き換えることができます。
親トピック: 連続問合せキャッシングの使用
連続問合せキャッシュの構成
-
連続問合せキャッシュがそれに基づく基礎となるキャッシュ
-
連続問合せキャッシュがキャッシュするサブセットを生成する基礎となるキャッシュの問合せ
基礎となるキャッシュには、別の連続問合せキャッシュを含めた任意のCoherenceキャッシュを使用できます。キャッシュは一般にCacheFactory
インスタンスで取得されます。これにより開発者は、キャッシュの名前を指定するのみでアプリケーションのキャッシュ構成情報に基づいて自動的にキャッシュを構成できます。たとえば:
NamedCache cache = CacheFactory.getCache("orders");
この問合せは、データのフィルタリングに使用される問合せと同じタイプになります。たとえば:
Filter filter = new AndFilter(new EqualsFilter("getTrader", traderid), new EqualsFilter("getStatus", Status.OPEN));
「キャッシュ内のデータの問合せ」を参照してください。
通常、キャッシュを問い合せるには、QueryMap
のメソッドを使用します。たとえば、トレーダー・オブジェクトの未決済ポジションすべてのスナップショットを取得するには、次のようにします。
Set setOpenTrades = cache.entrySet(filter);
同様に、連続問合せキャッシュは、次に示す同じ2つの要素で構成されます。
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter);
親トピック: 連続問合せキャッシングの使用
ContinuousQueryCacheに関連付けられているリソースのクリーンアップ
ContinuousQueryCache
のrelease()
メソッドを明示的にコールする必要があります。親トピック: 連続問合せキャッシングの使用
キーのみのキャッシュまたはキーと値のキャッシュ
CacheValues
プロパティを構成できるコンストラクタを使用します。たとえば:
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter, false);
必要に応じて、CacheValues
プロパティはキャッシュがインスタンス化された後で変更することもできます。たとえば:
cacheOpenTrades.setCacheValues(true);
連続問合せキャッシュに標準の(非Lite)イベント・リスナーがある場合、またはイベント・リスナーのいずれかがフィルタリングされる場合は、CacheValues
プロパティが自動的にtrueに設定されます。これは、イベントをフィルタリングする際、および発生させたイベントに古い値と新しい値を提供する際に、ローカルにキャッシュされた値を連続問合せキャッシュが使用するためです。
親トピック: 連続問合せキャッシングの使用
連続問合せキャッシュのリスニング
この項には次のトピックが含まれます:
連続問合せキャッシュのリスニングの概要
連続問合せキャッシュ自体は監視可能であるため、クライアントが連続問合せキャッシュに1つ以上のイベント・リスナーを配置することが可能です。たとえば:
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter); cacheOpenTrades.addMapListener(listener);
キャッシュに格納されているすべてのアイテムとキャッシュに追加されるすべてのアイテムに対してなんらかの処理を実行する必要がある場合、その方法は2つあります。1つは、処理を実行した後、以降の追加に対処するリスナーを追加する方法です。
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter); for (Iterator iter = cacheOpenTrades.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry) iter.next(); // .. process the cache entry } cacheOpenTrades.addMapListener(listener);
ただし、このコードは正しくありません。これでは、反復処理が終了してリスナーが追加されるまでのわずかの時間に発生したイベントを見逃すことになります。別の方法では、イベントを見逃さないように、まずリスナーを追加し、その後で処理を実行します。
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter); cacheOpenTrades.addMapListener(listener); for (Iterator iter = cacheOpenTrades.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry) iter.next(); // .. process the cache entry }
ただし、同じエントリがイベント内とIterator
内の両方に出現し、イベントが非同期になる可能性があるため、操作の順序が正しいことは保証できません。
解決策は、構成時にリスナーを指定することです。そうすることで、既存の(問合せに含まれていた)項目であるか、キャッシュの構成時または構成後に追加された項目かどうかに関係なく、連続問合せキャッシュ内の項目ごとにイベントが1つずつリスナーに送信されます。
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter, listener);
親トピック: 連続問合せキャッシュのリスニング
安定したマテリアライズド・ビューの実現
ContinuousQueryCache
実装にも同じ課題がありました。同じキャッシュから変更イベントのストリームを受信しながら、基礎となるキャッシュの正確なポイント・イン・タイム・スナップショットをいかにアセンブルするかということです。その解決法は、いくつかの部分に分かれています。まず、Coherenceでは同期イベントのオプションがサポートされており、これによって順序付けが保証されます。(マップ・イベントの使用を参照してください)。
また、ContinuousQueryCache
には初期移入の2フェーズ実装があります。これにより、基礎となるキャッシュを問い合せてから、第1フェーズで発生したすべてのイベントを解決できます。このようにイベントを見逃したり重複させたりすることなくデータの可視性を保証する操作はかなり複雑であるため、ContinuousQueryCache
では、アプリケーション開発者が作成時にリスナーを渡すことで、この複雑さに対処しなくても済むようにしています。
親トピック: 連続問合せキャッシュのリスニング
同期リスナーおよび非同期リスナーのサポート
デフォルトでは、ContinuousQueryCache
のリスナーにはイベントが非同期で配信されます。ただし、ContinuousQueryCache
では、SynchronousListener
インタフェースで提供されている同期イベントのオプションも対応しています。連続問合せキャッシングの使用を参照してください。
親トピック: 連続問合せキャッシュのリスニング
連続問合せキャッシュを読取り専用にする
ContinuousQueryCache
は、読取り専用キャッシュにすることができます。たとえば:
cacheOpenTrades.setReadOnly(true);
読取り専用のContinuousQueryCache
では、キャッシュ内でのオブジェクトの追加、変更、削除またはロックができません。
読取り専用に設定したContinuousQueryCache
を、読取り/書込みに戻すことはできません。
親トピック: 連続問合せキャッシングの使用