第 5 章 创建持续查询
应用程序可以注册监听程序,以接收与查询过滤器匹配的缓存条目的持续更新。
5.1. 持续查询
持续查询为应用程序提供有关查询过滤的数据的实时通知。当条目与查询数据平面将更新的数据发送到任何监听程序时,这提供了事件流,而不是需要执行查询的应用程序。
持续查询可以通知应用程序有关传入匹配项、用于已加入集合的值;针对已修改并继续匹配的匹配值,请针对已设置的值进行传出匹配。
例如,持续查询可以通知应用程序所有:
-
18 到 25 之间的年龄,假设
Person
实体具有age
属性,并由用户应用程序更新。 - 交易大于 $2000 的交易。
- F1 竞争器的 lap 速度小于 1:45.00 秒,假设缓存包含 Lap 条目,并在竞争期间输入 laps。
持续查询可以使用除分组、聚合和排序操作之外的所有查询功能。
持续查询的工作方式
持续查询会通知客户端监听程序,并带有以下事件:
join
- 缓存条目与查询匹配。
Update(更新)
- 与查询匹配的缓存条目已更新,仍然与查询匹配。
leave
- 缓存条目不再与查询匹配。
当客户端注册持续查询监听程序时,它会立即接收与查询匹配的任何条目的 加入
事件。每次缓存操作修改与查询匹配的条目时,客户端监听程序都会接收后续的事件。
Data Grid 决定何时向客户端监听程序发送 Join
、Update
或 Leave
事件,如下所示:
- 如果旧值和新值的查询不匹配,Data Grid 不会发送事件。
-
如果旧值上的查询不匹配,但新值确实会发送
加入
事件。 -
如果旧值和新值的查询都匹配,Data Grid 会发送
Update
事件。 -
如果旧值的查询匹配但新值不匹配,Data Grid 会发送
Leave
事件。 -
如果对旧值的查询匹配,且条目随后被删除或过期,Data Grid 会发送
Leave
事件。
5.1.1. 持续查询和数据平面性能
持续查询为应用程序提供恒定的更新流,生成大量事件。Data Grid 会临时为它生成的每个事件分配内存,这可能会导致内存压力,并可能导致 OutOfMemoryError
异常,特别是远程缓存。因此,您应该仔细设计您的持续查询以避免任何性能影响。
Data Grid 强烈建议您将持续查询的范围限制为您需要的最小信息量。要达到此目的,您可以使用 projections 和 predicates。例如,以下语句只提供有关与条件匹配而不是整个条目的字段子集的结果:
SELECT field1, field2 FROM Entity WHERE x AND y
确保您创建的每个 ContinuousQueryListener
都可以快速处理所有接收的事件,而不阻断线程。要达到此目的,您应该避免任何不必要的生成事件的缓存操作。