提问者:小点点

Gemfire-使用相同域对象的多个区域


我们在我们的一个通用缓存解决方案中使用了Gemfire PCC。在那里,客户端将使用gemfire作为缓存服务。为了实现,我们使用名称、值字段定义了通用数据模型。所以对于n个区域,它将是同一个类。

问题是,当该类类型的第一个put或putAll发生时,已使用插入的字段注册了PDXType。从那时起,每个缓存都使用相同的PDXType,因为类类型相同。

假设我在下面插入了记录Region on1-foo. GenericClass

  • name=FirstName, value=Abc
  • name=LastName, value=Def

之后,PDXType将注册到

info 2018/07/06 12:22:24.213 EDT <http-nio-8080-exec-4> tid=0x45] Caching PdxType[dsid=0, typenum=14294267
    name=foo.GenericClass
    fields=[
    _cacheName:String:0:idx0(relativeOffset)=0:idx1(vlfOffsetIndex)=-1
    FirstName:String:identity:1:1:idx0(relativeOffset)=0:idx1(vlfOffsetIndex)=1        
LastName:String:identity:2:1:idx0(relativeOffset)=-2:idx1(vlfOffsetIndex)=-1]]

从这里开始,所有关于foo. GenericClass的操作都使用相同的PDXType。

当我尝试在下面插入记录而不是AddressLine1时,它被存储为FirstName作为区域2中的字段名称。
区域2-foo. GenericClass

  • name=AddressLine1, value=123 Main St
  • 名称=城市,值=Atlata

无论如何,是否可以通过使用相同的域对象将数据插入不同的区域并在序列化期间注册它们自己的PDXTypes?我这里缺少一些简单的东西吗?


共2个答案

匿名用户

Rajanikanth你会分享你的类的源代码以及它们是如何被实例化为具有这些值的吗?一个带有“名称”和“值”字段的简单Java类不应该像这样被序列化。另外,你使用的是反射基自动序列化器、Spring序列化器还是其他什么?

匿名用户

你好@rajanikanth,

正如布鲁斯所指出的,提供的PDX定义不是预期的,

Caching PdxType[dsid=0, typenum=14294267, name=foo.GenericClass
,fields=[
  _cacheName:String:0:idx0(relativeOffset)=0:idx1(vlfOffsetIndex)=-1
  name:String:identity:1:1:idx0(relativeOffset)=0:idx1(vlfOffsetIndex)=1        
  value:String:identity:2:1:idx0(relativeOffset)=-2:idx1(vlfOffsetIndex)=-1]]

虽然我可以理解想要创建一个泛型类的好处,以避免有一个明确定义的领域模型和关心如何处理变化,我只能认为这种建模数据的方法是不可扩展的。

虽然PCC是一个键值存储,但我只能想象您的区域定义必须类似于Region

UserObject:
  _cacheName: String
  data: Set<GenericClass>

查看提供的输入数据,我认为可能更好的方法是以以下方式建模GenericClass:

GenericClass:
  _cacheName: String
  className: String
  genericData: Map<String,Object>

这样,您可以通过以下方式代表用户(请原谅我粗略的JSON符号):

GenericClass:
  _cacheName = "UserCache"
  className = "foo.bar.User"
  genericData = {("firstName":"Bob"),("lastName":"Sponge"),("AddressLine1":"100 Under the Sea Lane"),("age":21)}

现在,如果您不关心搜索任何特定的用户属性,使用这种方法是“可接受的”。但是,如果您想使用一定数量的查询功能来查找lastName为“Sponge”的所有用户或30岁以下的用户,这种方法将非常低效。此外,查看所描述的GenericClass,您还可以使用:

GenericClass:
  _cacheName: String
  jsonDocument: String