第5章 継続的なクエリーの作成
アプリケーションはリスナーを登録して、クエリーフィルターに一致するキャッシュエントリーに関する継続的な更新を受け取ることができます。
5.1. 継続的なクエリー
継続的なクエリーは、クエリーでフィルターされる Data Grid キャッシュのデータに関するリアルタイムの通知をアプリケーションに提供します。エントリーがクエリー Data Grid と一致する場合は、更新されたデータを任意のリスナーに送信します。これは、クエリーを実行するアプリケーションではなく、イベントのストリームを提供します。
継続的なクエリーは、セットに参加した値についてアプリケーションに通知します。一致する値に対して一致し、変更して一致し続けた値については、そのセットを残す値について通知できます。
たとえば、継続的なクエリーはアプリケーションにすべてについて通知できます。
-
18〜25 歳の人で、
Person
エンティティーにage
プロパティーがあり、ユーザーアプリケーションによるエンティティー更新を想定する場合。 - 2000 ドルを超える金額のトランザクション。
- キャッシュにラップエントリーが含まれ、レース中にラップが入力されたと仮定して、F1 レーサーのラップ速度が 1:45.00 秒未満であった時間。
継続的なクエリーは、グループ化、集約、およびソート操作以外のすべてのクエリー機能を使用できます。
継続的なクエリーの仕組み
継続的なクエリーは、以下のイベントでクライアントリスナーに通知します。
Join
- キャッシュエントリーがクエリーと一致します。
更新
- クエリーに一致するキャッシュエントリーが更新され、引き続きクエリーに一致します。
Leave
- キャッシュエントリーがクエリーと一致しなくなりました。
クライアントが継続的なクエリーリスナーを登録すると、クエリーに一致するエントリーの Join
イベントをすぐに受信します。クライアントリスナーは、キャッシュ操作がクエリーに一致するエントリーを変更するたびに、後続のイベントを受け取ります。
Data Grid は、以下のように Join
、Update
、または Leave
イベントをクライアントリスナーに送信するタイミングを決定します。
- 古い値と新しい値のクエリーが一致しない場合、Data Grid はイベントを送信しません。
-
古い値のクエリーが一致しず、新しい値を指定すると、Data Grid は
Join
イベントを送信します。 -
古い値と新しい値の両方のクエリーが一致する場合、Data Grid は
Update
イベントを送信します。 -
古い値のクエリーが一致しても、新しい値がない場合、Data Grid は
Leave
イベントを送信します。 -
古い値のクエリーが一致し、エントリーが削除されるか、期限切れになると、Data Grid は
Leave
イベントを送信します。
5.1.1. 継続クエリーと Data Grid のパフォーマンス
継続的なクエリーは、アプリケーションに更新の定数ストリームを提供しており、大量のイベントを生成できます。Data Grid は、生成する各イベントにメモリーを一時的に割り当てます。これにより、メモリー不足が発生し、特にリモートキャッシュに対して OutOfMemoryError
例外が発生する可能性があります。このため、パフォーマンスへの影響を回避するために、継続的なクエリーを慎重に設計する必要があります。
Data Grid は、継続的なクエリーのスコープを必要な情報の最小量に制限することを強く推奨します。これを実行するには、プロジェクション および述語を使用できます。たとえば、以下のステートメントでは、エントリー全体ではなく基準に一致するフィールドのサブセットのみに関する結果を表示します。
SELECT field1, field2 FROM Entity WHERE x AND y
また、各 ContinuousQueryListener
は、ブロッキングスレッドを使用せずに受信したすべてのイベントを迅速に処理できるようにすることが重要です。これを実行するには、イベントを不必要に生成するキャッシュ操作を回避する必要があります。