我正在使用Pivotal GemFire 9.0.0和1个Locator和1个服务器。服务器有一个名为“提交”的区域,如下所示 -
cmd.exe
执行以下代码时,我将Region设为null -
<gfe:replicated-region id="submissionsRegion" name="submissions"
statistics="true" template="replicateRegionTemplate">
...
</gfe:replicated-region>
令人惊讶的是,当我使用OQL和Region<K, V> region = clientCache.getRegion("submissions");
进行查询时,相同的ClientCache
会返回所有记录,如下所示 -
QueryService
我正在初始化我的String queryString = "SELECT * FROM /submissions";
QueryService queryService = clientCache.getQueryService();
Query query = queryService.newQuery(queryString);
SelectResults results = (SelectResults) query.execute();
-
ClientCache
我对此感到非常困惑。任何指针或帮助都会很棒。
答案 0 :(得分:2)
您还需要为区域配置 ClientCache (通过cache.xml或纯GemFire API)。使用您的示例:
ClientRegionFactory regionFactory = clientCache.createClientRegionFactory(ClientRegionShortcut.PROXY);
Region region = regionFactory.create("submissions");
ClientRegionShortcut.PROXY 仅用于简单起见,您应该使用符合您需求的快捷方式。
OQL按预期工作,因为您通过 ClientCache.getQueryService()方法获取 QueryService (而不是 ClientCache.getLocalQueryService()),因此查询实际上是在服务器端执行的。
您可以获取有关如何配置客户端/服务器拓扑的更多信息 Client/Server Configuration
希望这有帮助。
干杯。
答案 1 :(得分:1)
是的,你需要&#34;定义&#34;相应的客户端区域,按名称与服务器端REPLICATE
区域匹配(即&#34;提交&#34;)。实际上这是一个独立于服务器区域的要求。 DataPolicy
类型(例如REPLICATE
或PARTITION
)。
这是必要的,因为并非每个客户都想知道甚至需要来自每个可能的服务器区域的数据/事件。当然,这也可以通过订阅和&#34;兴趣注册&#34; (使用Client/Server Event Messaging,或者CQs)。
无论如何,通过使用SDG的XML命名空间,您可以完全避免直接使用GemFire API,甚至可以完全避免使用GemFire的本地cache.xml
(强烈建议避免使用)...
<gfe:client-cache properties-ref="gemfireProperties" ... />
<gfe:client-region id="submissions" shortcut="PROXY"/>
或者使用SDG的API使用 Spring JavaConfig ...
@Configuration
class GemFireConfiguration {
Properties gemfireProperties() {
Properties gemfireProperties = new Properties();
gemfireProperties.setProperty("log-level", "config");
...
return gemfireProperties;
}
@Bean
ClientCacheFactoryBean gemfireCache() {
ClientCacheFactoryBean gemfireCache = new ClientCacheFactoryBean();
gemfireCache.setClose(true);
gemfireCache.setProperties(gemfireProperties());
...
return gemfireCache;
}
@Bean(name = "submissions");
ClientRegionFactoryBean submissionsRegion(GemFireCache gemfireCache) {
ClientRegionFactoryBean submissions = new ClientRegionFactoryBean();
submissions.setCache(gemfireCache);
submissions.setClose(false);
submissions.setShortcut(ClientRegionShortcut.PROXY);
...
return submissions;
}
...
}
&#34;提交&#34;区域可以用SDG GemfireTemplate包裹,它将处理正确的&#34;正确的&#34;使用find(..)方法运行查询时代表您QueryService
。
当然,您可能有兴趣制作您的客户&#34;提交&#34;区域a CACHING_PROXY
&#34;太。当然,您需要注册&#34;兴趣&#34;在利益的钥匙或数据。 CQ是最好的方法,因为它使用查询标准来定义&#34;兴趣&#34;的数据。
CACHING_PROXY
就像听起来一样,根据兴趣政策在客户端本地缓存数据。这也使您能够使用&#34; local&#34; QueryService
在本地查询数据,避免网络跳跃。
无论如何,这里有很多选择。
干杯, 约翰