使用连续查询缓存
虽然有可能取得时间从连贯缓存查询结果中的一个点,并有可能以接收事件,将改变该查询的结果,连贯性提供了一个功能,它结合了与一个连续的数据流中的相关事件的查询结果在一个实时的方式保持一个最新的日期的查询结果。这种能力被称作连续查询,因为它具有相同的效果,如果想要查询的零延迟和查询被执行多次,每毫秒!点时间查询结果和事件的更多信息,请参见第22章,“查询缓存中的数据。”
相干物化成一个连续查询缓存查询结果,然后,缓存保持最新实时查询使用事件侦听器实现连续查询功能。换句话说,一个连贯性的连续查询是一个缓存的查询结果,永远不会过期。
本章包含以下各节:
连续查询缓存的用途
连续查询缓存相干
构建连续查询缓存
只缓存键,或缓存键和值
监听ContinuousQueryCache的
使ContinuousQueryCache只读
23.1利用连续查询缓存
有几种不同的连续查询缓存一般用途类别:
它是一种理想的建筑块的复杂事件处理(CEP )系统和事件关联引擎。
这是理想的情况下,应用程序重复一个特定的查询,并且将受益于总是具有即时访问,查询到最新的结果。
连续查询缓存类似于物化视图,和一个查询的结果使用标准NamedCache API用于访问和操作,并接收该查询相关的事件持续流是非常有用的。
到接近缓存类似的方式,可以使用一个连续查询缓存,因为它保持一个最新的最新的一组本地正在使用它的数据,例如特定服务器上的节点或客户机上的桌面;注意,近缓存是无效的,但实际上连续查询缓存中维护其数据的最新方式。
一个例子使用的情况下是一个交易系统桌面,其中一位交易员的未结订单和所有相关的信息,必须始终保持在最新的方式。通过结合连续查询缓存相干*扩展功能,应用程序可以支持几十数千个并发用户。
注意事项:
连续查询缓存是非常有用的,因为它们提供了几乎所有类型的应用程序,包括基于客户端和基于服务器的应用程序的能力,很容易和有效地维护一个指定的子集到最新的本地副本更大,可能分布的高速缓存的数据集。
23.2 Coherence连续查询缓存
相干实施连续查询发现在com.tangosol.net.cache.ContinuousQueryCache类。这一类,像所有相干缓存,实行标准NamedCache的接口,其中包括以下功能:
缓存访问和操作使用的地图界面: NamedCache扩展了标准的Java集合框架,它的界面是相同的JDK的HashMap和Hashtable类实现的Map接口。
活动的所有对象的修改发生在缓存中: NamedCache延伸的ObservableMap接口。
基于身份的的群集范围锁定在缓存中的对象: NamedCache ConcurrentMap接口扩展。
查询缓存中的对象: NamedCache扩展属性查图的界面。
分布式并行处理和聚合缓存中的对象: NamedCache延伸接口InvocableMap 。
由于的ContinuousQueryCache实现NamedCache的接口,这是相同的API所提供的所有相干高速缓存,它是非常简单的使用,它可以很容易地取代的另一个高速缓存时,它的功能要求。
23.3构建一个连续查询缓存
有两个项目定义连续查询缓存:
它是基于底层的缓存;
产生子集,底层的缓存查询,连续查询缓存缓存。
底层的缓存是任何连贯性高速缓存,包括另一个连续查询缓存。高速缓存通常是获得递给CacheFactory ,它允许开发人员只需指定名称的缓存,它会自动配置基于应用程序的缓存配置信息,例如:
NamedCache cache = CacheFactory.getCache("orders");
见附录B , “缓存配置元素”的更多信息,指定缓存配置信息。
查询是将用于相同类型的查询,例如:
例23-1连续查询缓存的查询
Filter filter = new AndFilter(new EqualsFilter("getTrader", traderid),
new EqualsFilter("getStatus", Status.OPEN));
参见第22章“查询缓存中的数据”更多信息查询。
通常情况下,查询缓存,属性查方法的例子,此交易的所有开放的行业获得一个快照:
例23-2连续查询缓存中获取数据
Set setOpenTrades = cache.entrySet(filter);
同样,那些相同的两片连续查询缓存构造:
示例23-3构造连续查询缓存
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter);
23.3.1清理相关的资源与ContinuousQueryCache
连续查询缓存放置一个或多个事件侦听器,其底层的缓存。如果连续查询缓存用于该应用程序的持续时间,然后清洁的资源时,该节点被关闭或以其他方式停止。但是,如果连续查询缓存仅用于一个时期,然后使用它来完成应用程序时,应用程序必须调用release()方法在ContinuousQueryCache上。
23.4只缓存键,或缓存键和值
当构建一个连续查询缓存,它是可以指定缓存应该只跟踪的关键,从查询的结果,并获得只有当它们被要求从底层的缓存值。创建一个连续的,代表一个非常大的查询结果集的查询缓存这个功能可能是有用的,如果值是从来没有或很少要求。要指定唯一的键应该是高速缓存,使用构造函数允许的CacheValues??属性进行配置,例如:
例23-4构造函数允许CacheValues属性
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter, false);
如果有必要,也可以进行修改的CacheValues??属性缓存已经被实例化后,例如:
例23-5设置CacheValues属性
cacheOpenTrades.setCacheValues(true);
23.4.1 CacheValues属性和事件监听器
如果连续查询缓存有任何标准(非精简版)的事件监听器,或者如果任何事件侦听器过滤,然后的CacheValues??属性被自动设置为true ,因为连续查询缓存使用本地缓存的值来过滤事件供货旧的和新的值,它会引发的事件。
23.5监听ContinuousQueryCache
由于连续查询缓存本身是可观察的,它有可能为客户端在其上放置一个或多个事件侦听器。例如:
例23-6连续查询缓存中添加一个监听器
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter);
cacheOpenTrades.addMapListener(listener);
假设一些处理发生缓存和每一个项目添加到缓存中,在对每一个项目,有两种方法。首先,处理可能发生的然后可以添加一个侦听器来处理任何后来增加:
例23-7处理连续查询缓存条目的添加一个监听器
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); |
然而,这代码是不正确的,因为它允许迭代后前监听在一瞬间发生的事件被添加到被错过!另一种方法是先添加一个侦听器,所以没有事件被错过,然后做加工:
例23-8添加一个监听器在处理连续查询缓存条目
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 } |
然而,相同的条目可以出现在这两个事件中的迭代,事件可以是异步的,所以不能得到保证的操作顺序。
解决的办法是在施工期间提供侦听器,它接收到一个事件的连续查询缓存中的每个项目,是否它在那里,因为它是在查询开始( )或过程中或之后添加了,如果是缓存建设:
例23-9建设提供一个监听器,当连续查询缓存
ContinuousQueryCache cacheOpenTrades = new ContinuousQueryCache(cache, filter, listener);
23.5.1实现一个稳定的物化视图
ContinuousQueryCache实现面临着同样的挑战:如何组装一个确切的时间点的快照,底层的缓存,同时接收来自同一缓存的修改事件流。该解决方案有几个部分。首先, Coherence支持同步事件的一个选项,它提供了一组排序保证。此选项的更多信息,请参见第21章“使用高速缓存活动”, 。
其次, ContinuousQueryCache其初始人口,允许其先查询底层的缓存,然后解决所有的事件,排在第一阶段期间有一个两阶段实施。由于实现这些数据可见性担保没有任何缺失或重复的事件是相当复杂的,的ContinuousQueryCache允许开发人员通过一个监听器,在建设过程中,从而避免让这些相同的应用程序开发人员的复杂性。
23.5.2支持同步和异步的听众
默认情况下,听众ContinuousQueryCache的异步传递他们的活动。然而,的ContinuousQueryCache尊重如由SynchronousListener接口提供的同步事件的选项。此选项的更多信息,请参见第23章“使用连续查询缓存, ” 。
23.6制作ContinuousQueryCache的只读
ContinuousQueryCache可制作成一个只读缓存,例如:
示例23-10连续查询缓存只读
cacheOpenTrades.setReadOnly(true);
不允许只读ContinuousQueryCache的对象添加,更改,删除或锁定在缓存中。
当一个ContinuousQueryCache已被设置只读,不能改回读/写。