如何在 Gemfire 区域中创建复合主键场景?

How to create composite primary key scenario in Gemfire region?

我正在将大型机迁移到 java。我在 DB2 中有一个 table。我正在将此 table 复制为 Gemfire 中的一个区域。在执行此操作时,我有 table 的复合主键。将 table 复制到 gemfire 区域。我想为区域创建复合主键。我只想知道,是否有可能在区域中创建复合主键?

理想情况下,您创建的键值在 Key/Value 对 "put" 进入区域后不会改变。 GemFire/Geode 区域只是 java.util.Map 的美化版本(准确地说是 HashMap)。

这意味着 "composite" 键不应基于区域值本身中的任何 属性 值。举例来说,假设我有一个值 Customer 定义如下...

class Customer {

  Long accountNumber;

  Gender gender;

  LocalDate birthDate;

  String firstName;
  String lastName;

  ...
}

然后像这样创建一个密钥是不可取的...

class CustomerKey {

  LocalDate birthDate;

  String firstName;
  String lastName;

}

虽然一个人的出生日期、名字和姓氏通常足以唯一地识别一个人,但如果这些个人 property/field 值中的任何一个发生变化,那么鉴于 [=59= 的内在行为,您将失去配对] Map(所以要小心)

您还应该注意精心制作您创建的任何 "custom/composite" 键 class 的 equals/hashCode 方法。

我通常建议您使用内部(仅应用程序知道)标量类型作为密钥,例如LongString.

这就像在 Customer class 中添加一个 property/field 一样简单...

class Customer {

  Long id;

  ...

}

大多数时候,您的 (OQL) 查询谓词基于单个域对象 properties/fields 的值,而不是键。例如...

SELECT c FROM /Customers c WHERE c.lastName = 'Doe'

此外,如果您的密钥是 String,您可以使用 UUID class 生成唯一值。否则,您将需要制定自己独特的密钥生成策略。

总而言之,虽然在 Java 中精心设计了 class 类型,但您的要求是可能的,通常不推荐这样做;更喜欢简单的标量类型。

这里有一个 link 要记住的一般事项。

希望这对您有所帮助。

-约翰