可以在单个查询中对父区域的所有子区域执行GemFire OQL查询

时间:2015-02-04 04:11:17

标签: gemfire oql spring-data-gemfire

我需要制作像下面这样的区域的层次结构,通常我按国家和类型查询。我将所有数据都放在国家级地区。有时我会在NAM_Type1中查询各个国家/地区,有时还会查询全球。

Global_Type1
-> NAM_Type1
-->  USA
-->  Mexico
-> APAC_Type1
-->  Japan
-->  HongKong

有没有办法可以查询父区域,而无需在各个国家/地区多次查询?

可以在父级别制作索引吗?

我使用带有spring-gemfire的GemFire 7.0进行连接。

1 个答案:

答案 0 :(得分:0)

@Ashish

如果我正确理解您的问题,快速回答是

似乎您想使用父(例如NAM_Type1)区域来引用,或者更确切地查询父项的多个子区域中包含的数据(例如美国,墨西哥等)并“聚合”所有结果分区???

例如,假设您的子区域包含客户对象......

public class Customer ... {
  private String firstName;
  private String lastName;
  private boolean active;
  ...
}

则...

SELECT * FROM /NAM_Type1 nam WHERE nam.active = 'true';

该OQL查询被破坏,因为它们在父区域(例如NAM_Type1)和子区域(例如美国等)中的条目之间没有参考。如果您仅为命名空间层次结构使用“父”区域,则它们根本不包含任何数据。

我想知道需要什么才能拥有“子区域”?在数据访问方面(特别是使用OQL /查询),子区域与顶级区域的区别不同。

通过使用子区域,它意味着您正在使用并且仅限于使用“GemFire用户指南”(http://gemfire.docs.pivotal.io/latest/userguide/index.html#basic_config/data_regions/managing_data_regions.html)中提到的REPLICATE区域。出于这个原因,GemFire团队通常不鼓励使用子区域,特别是在交易数据可能发生很大变化的情况下。

通常,您希望将PARTITION区域用于事务数据,而REPLICATE区域主要用于较小的数据集,通常用于引用/查找类型数据。

因此,在您的情况下,您可能会通过......实现类似的行为。

  1. 使用PARTITION Regions ...
  2. 在不同的服务器上配置和创建...
  3. 根据您上面提到的层级组织,组织到不同的服务器组中。
  4. 然后,您可以在托管感兴趣的人口统计区域数据的特定服务器组中的服务器上定位并运行GemFire功能,以在Region的本地数据集上运行OQL查询。函数将聚合然后返回结果。

    有不同的方法来组织和分区数据,甚至使用自定义“PartitionResolvers”等,或目标函数,等等。

    通过使用PARTITION Regions,您仍然可以使用“copies”属性(对应于GemFire的PartitionAttributes.redundantCopies属性)来实现HA(冗余)。您可以选择“共同定位”数据,使等连接查询成为可能/最佳。

    免责声明:不熟悉您的用例和要求,我的建议可能适用于您的情况,也可能不适用,但通常使用GemFire可以更优雅,更有效地实现子区域的效果其他特性。如果有的话,也许这会给你一些想法。

    希望这有帮助!

    -John