第 5 章 创建持续查询
应用程序可以注册监听程序来接收有关与查询过滤器匹配的缓存条目的持续更新。
5.1. 持续查询
持续查询为应用程序提供关于通过查询过滤的 Data Grid 缓存中数据的实时通知。当条目与查询 Data Grid 匹配时,会将更新的数据发送到任何监听程序,它提供事件流,而不是必须执行查询的应用程序。
持续查询可以通知应用程序有关传入匹配项、加入集合的值;更新匹配,以获得已修改并继续匹配项的匹配值;以及传出的匹配,对于离开该集合的值。
例如,持续查询可以通知应用程序:
-
在 18 到 25 之间有年龄的个人,假设
Person
实体具有年龄
属性,并由用户应用程序更新。 - 交易量超过 2000美元.
- F1 竞争者的 lap 速度小于 1:45.00 秒时,假设缓存包含 Lap 条目,并在竞争过程中输入 laps。
持续查询可以使用所有查询功能,但分组、聚合和排序操作除外。
持续查询的工作方式
持续查询使用以下事件通知客户端监听程序:
join
- 缓存条目与查询匹配。
Update(更新)
- 与查询匹配的缓存条目已更新,仍然与查询匹配。
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 会临时为它生成的每个事件分配内存,这可能会导致内存压力,并可能导致 OutOfMemoryError
异常,特别是对于远程缓存。因此,您应该仔细设计您的连续查询以避免出现性能影响。
Data Grid 强烈建议您将持续查询的范围限制为您需要的最小信息。要达到此目的,您可以使用 projections 和 predicates。例如,以下语句只提供与条件匹配的字段子集而不是整个条目的结果:
SELECT field1, field2 FROM Entity WHERE x AND y
还需要确保创建的每个 continuous QueryListener
可以快速处理所有接收的事件,而无需阻塞线程。要达到此目的,您应该避免任何不必要地生成事件的缓存操作。