20 連続問合せの実行(.NET)
この章の内容は次のとおりです。
- 連続問合せの実行の概要(.NET)
問合せは、Coherenceキャッシュから特定の時点の問合せ結果を取得でき、さらに問合せの結果が変更された場合のイベントを受信できます。 - 連続問合せキャッシュのユース・ケースの理解
連続問合せキャッシュは、イベント処理や最新の問合せ結果への即時アクセスなど、多くのユース・ケースで理想的です。 - 連続問合せキャッシュの実装の理解
連続問合せのCoherence for.NET実装は、Tangosol.Net.Cache.ContinuousQueryCache
クラスにあります。 - 連続問合せキャッシュの構成
ContinuousQueryCache
クラスは、連続問合せキャッシュに使用され、その基礎となるキャッシュおよび問合せフィルタを必要とします。 - 連続問合せキャッシュ・リソースのクリーンアップ
すべてのINamedCache
実装のインスタンスは、ContinuousQueryCache
を含め、不要になった時点でINamedCache.Release()
メソッドをコールして明示的に解放し、これらのインスタンスで保持されているリソースをすべて解放する必要があります。 - キーのみのキャッシングと、キーおよび値のキャッシング
連続問合せキャッシュを構成する際、問合せで取得されたキーのみをキャッシュで追跡し、要求された場合にのみ、その値を基礎となるキャッシュから取得するように指定できます。 - 連続問合せキャッシュのリスニング
クライアントは、1つまたは複数のイベント・リスナーを連続問合せキャッシュに配置できます。 - 連続問合せキャッシュを読取り専用にする
連続問合せキャッシュは、読取り専用キャッシュにできます。
親トピック: .NET Extendクライアントの作成
連続問合せの実行の概要(.NET)
Coherence for .NETでは、問合せ結果をマテリアライズして連続問合せキャッシュに格納し、問合せに対するイベント・リスナーを使用してそのキャッシュをリアルタイムに最新の状態に維持することで、連続問合せ機能を実装します。つまり、Coherence for .NETの連続問合せでは、キャッシュされた問合せ結果が古くなることはありません。
親トピック: 連続問合せ(.NET)の実行
連続問合せキャッシングの用途の理解
次のような状況では、連続問合せキャッシュを使用することを検討してください。
-
連続問合せキャッシュは、複雑なイベント処理(CEP)システムおよびイベント相関エンジン用の理想的な構成要素です。
-
アプリケーションが特定の問合せを繰り返し実行し、その問合せの最新の結果に常に即座にアクセスできることが有益である状況では、連続問合せキャッシュが理想的です。
-
連続問合せキャッシュはマテリアライズド・ビューに類似しており、標準の
INamedCache
APIを使用して問合せの結果にアクセスして操作する場合、およびその問合せに関連するイベントの現行ストリームを受信する場合に役立ちます。 -
連続問合せキャッシュは、最新のデータセットを使用場所(特定のサーバー・ノードやクライアント・デスクトップなど)でローカルに保持できるため、ニア・キャッシュと同様の方法で使用できます。ニア・キャッシュは無効化ベースですが、連続問合せキャッシュでは実際にデータが最新の状態で保持されます。
使用例の1つにトレーディング・システム・デスクトップがあります。このデスクトップには、トレーダーの未処理の注文とすべての関連情報が常に最新の状態で保持されている必要があります。Coherence*Extend機能を連続問合せキャッシュと組み合せることにより、アプリケーションで文字どおり何万もの同時ユーザーをサポートできます。
ノート:
連続問合せキャッシュは、分散される可能性のあるより大きなキャッシュ・データセットの特定のサブセットについて、その最新のローカル・コピーを非常に簡単かつ効果的に維持する機能を提供します。そのため、クライアントベースおよびサーバーベースのアプリケーションを含め、ほとんどすべてのタイプのアプリケーションに有用です。
親トピック: 連続問合せ(.NET)の実行
連続問合せキャッシュの実装の理解
Tangosol.Net.Cache.ContinuousQueryCache
クラスを使用します。このクラスは、Coherence for .NETのすべてのキャッシュ同様、次の機能を備えた標準のINamedCache
インタフェースを実装します。
-
IDictionary
インタフェースを使用したキャッシュのアクセスと操作:INamedCache
は、.NETコレクション・フレームワークの標準のIDictionary
インタフェース(.NETHashtable
クラスで実装されるインタフェースと同じ)を拡張します。 -
キャッシュ内で発生するすべてのオブジェクト変更に対するイベント発行:
INamedCache
はIObservableCache
インタフェースを拡張します。 -
キャッシュ内オブジェクトの問合せ:
INamedCache
はIQueryCache
インタフェースを拡張します。 -
キャッシュ内オブジェクトの分散パラレル処理および集約:
INamedCache
はIInvocableCache
インタフェースを拡張します。
ContinuousQueryCache
クラスは、Coherence for .NETのすべてのキャッシュで提供されるAPIであるINamedCache
インタフェースを実装しているため、非常に使いやすく、その機能が必要になった場合に別のキャッシュと簡単に置き換えることができます。
親トピック: 連続問合せ(.NET)の実行
連続問合せキャッシュの構成
ContinuousQueryCache
クラスは、連続問合せキャッシュに使用され、その基礎となるキャッシュおよび問合せフィルタを必要とします。基礎となるキャッシュには、別の連続問合せキャッシュを含めた任意のCoherence for .NETキャッシュを使用できます。キャッシュは一般にCacheFactory
で取得されます。これにより開発者は、キャッシュの名前を指定するだけでアプリケーションのキャッシュ構成情報に基づいて自動的にキャッシュを構成できます。たとえば:
INamedCache cache = CacheFactory.GetCache("orders");
この問合せは、他のキャッシュの問合せに使用される問合せと同じタイプです。たとえば:
Filter filter = new AndFilter(new EqualsFilter("getTrader", traderid), new EqualsFilter("getStatus", Status.OPEN));
通常、キャッシュを問い合せるには、IQueryCache
のメソッドを使用します。たとえば、このトレーダーの未決済ポジションすべてのスナップショットを取得するには、次のコードを使用します。
ICollection setOpenTrades = cache.GetEntries(filter);
同様に、連続問合せキャッシュは、次に示す同じ2つの要素で構成されます。
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter);
親トピック: 連続問合せ(.NET)の実行
連続問合せキャッシュ・リソースのクリーンアップ
INamedCache
実装のインスタンスは、ContinuousQueryCache
を含め、不要になった時点でINamedCache.Release()
メソッドをコールして明示的に解放し、これらのインスタンスで保持されているリソースをすべて解放する必要があります。特定のINamedCache
がアプリケーションの継続期間を通して使用される場合、リソースはそのアプリケーションがシャットダウンされたとき、または停止したときにクリーンアップされます。ただし、わずかの間だけ使用される場合は、使い終わった時点でアプリケーションからRelease()
メソッドをコールする必要があります。
または、INamedCache
がIDisposable
を拡張し、すべてのキャッシュ実装がIDisposable.Dispose()
のコールをINamedCache.Release()
に委任しているという事実を利用する方法もあります。単一メソッド内でキャッシュ・インスタンスを取得および解放する必要がある場合、次のusingブロックを使用してそれを実現できます。
using (INamedCache cache = CacheFactory.GetCache("my-cache")) { // use cache as usual }
usingブロックが終了すると、INamedCache
インスタンスでIDisposable.Dispose()
がコールされ、そのインスタンスに関連付けられているすべてのリソースが解放されます。
親トピック: 連続問合せ(.NET)の実行
キーのみのキャッシングと、キーおよび値のキャッシング
キーのみをキャッシュするように指定するには、IsCacheValues
プロパティを構成できるコンストラクタを使用します。たとえば:
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter, false);
必要に応じて、キャッシュがインスタンス化された後にIsCacheValues
プロパティを変更することもできます。たとえば:
cacheOpenTrades.IsCacheValues = true;
IsCacheValuesプロパティとイベント・リスナー
連続問合せキャッシュに標準の(非Lite)イベント・リスナーがある場合、またはイベント・リスナーのいずれかがフィルタリングされる場合は、IsCacheValues
プロパティが自動的にtrue
に設定されます。これは、イベントをフィルタリングする際、および発生させたイベントに古い値と新しい値を提供する際に、ローカルにキャッシュされた値を連続問合せキャッシュが使用するためです。
この項には次のトピックが含まれます:
親トピック: 連続問合せ(.NET)の実行
連続問合せキャッシュのリスニング
たとえば:
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter); cacheOpenTrades.AddCacheListener(listener);
キャッシュに格納されているすべてのアイテムとキャッシュに追加されるすべてのアイテムに対してなんらかの処理を実行する必要がある場合、その方法は2つあります。1つは、処理を実行した後、以降の追加に対処するリスナーを追加する方法です。
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter); foreach (ICacheEntry entry in cacheOpenTrades.Entries) { // .. process the cache entry } cacheOpenTrades.AddCacheListener(listener);
ただし、このコードは正しくありません。これでは、反復処理が終了してリスナーが追加されるまでのわずかの時間に発生したイベントを見逃すことになります。別の方法では、イベントを見逃さないように、まずリスナーを追加し、その後で処理を実行します。
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter); cacheOpenTrades.AddCacheListener(listener); foreach (ICacheEntry entry in cacheOpenTrades.Entries) { // .. process the cache entry }
ただし、イベントとIEnumerator
の両方に同じエントリが出現する可能性があります。また、イベントは非同期の可能性があるため、操作の順序は保証されません。
これを解決するには、構成時にリスナーを提供します。これで、連続問合せキャッシュ内のアイテムが(問合せに含まれていたため)最初から存在していたか、キャッシュの作成中または作成後に追加されたかに関係なく、連続問合せキャッシュはアイテムごとに1つのイベントを受信します。
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter, listener);
この項には次のトピックが含まれます:
安定したマテリアライズド・ビューの実現
連続問合せキャッシュの実装にも同じ課題がありました。同じキャッシュから変更イベントのストリームを受信しながら、基礎となるキャッシュの正確なポイント・イン・タイム・スナップショットをいかにアセンブルするかということです。その解決法は、いくつかの部分に分かれています。第1に、Coherence for .NETでは同期イベントのオプションがサポートされ、それによって一連の順序保証が実現します。第2に、連続問合せキャッシュでは、その初期移入の実装が2つのフェーズに分かれているため、まず基礎となるキャッシュに対して問合せを実行し、その後、最初のフェーズ中に発生したイベントをすべて解決できます。このようにイベントを見逃したり重複させたりすることなくデータの可視性を保証する操作はかなり複雑であるため、連続問合せキャッシュでは、アプリケーション開発者が作成時にリスナーを渡すことで、この複雑さに対処しなくても済むようにしています。
親トピック: 連続問合せキャッシュのリスニング
同期リスナーおよび非同期リスナーのサポート
デフォルトでは、連続問合せキャッシュに対するリスナーによって、リスナーのイベントが非同期に配信されます。ただし連続問合せキャッシュでは、CacheListenerSupport.ISynchronousListener
インタフェースで規定されているとおり、同期イベントのオプションが考慮されます。
親トピック: 連続問合せキャッシュのリスニング
連続問合せキャッシュを読取り専用にする
たとえば:
cacheOpenTrades.IsReadOnly = true;
読取り専用の連続問合せキャッシュでは、オブジェクトの追加、変更、削除またはロックができません。
連続問合せキャッシュを読取り専用に設定した後は、読取り/書込みに戻すことはできません。
親トピック: 連続問合せ(.NET)の実行