GemFire getRegion()返回null,而OQL查询给出结果

时间:2017-07-05 09:55:31

标签: gemfire spring-data-gemfire

我正在使用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

我对此感到非常困惑。任何指针或帮助都会很棒。

2 个答案:

答案 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类型(例如REPLICATEPARTITION)。

这是必要的,因为并非每个客户都想知道甚至需要来自每个可能的服务器区域的数据/事件。当然,这也可以通过订阅和&#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在本地查询数据,避免网络跳跃。

无论如何,这里有很多选择。

干杯, 约翰