Cloud foundry Gemfire-使用同一域对象的多个区域

Cloud foundry Gemfire-使用同一域对象的多个区域,cloud-foundry,gemfire,geode,spring-data-gemfire,Cloud Foundry,Gemfire,Geode,Spring Data Gemfire,我们正在使用Gemfire PCC作为通用缓存解决方案之一。客户端将使用gemfire作为缓存服务。为了实现这一目标,我们使用名称、值字段定义了公共数据模型。所以对于n个区域,它将是同一类 问题是,当此类类型的第一个put或putAll发生时,PDXType已使用插入的字段注册。从那时起,由于相同的类类型,每个缓存都使用相同的PDXType 假设我插入了下面的记录 Region1-foo.GenericClass name=FirstName,value=Abc name=LastName,v

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

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

假设我插入了下面的记录 Region1-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]]
info 2018/07/06 12:22:24.213 EDT tid=0x45]缓存PDX类型[dsid=0,typenum=14294267
name=foo.GenericClass
田地=[
_cacheName:String:0:idx0(相对偏移)=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]]
从这里开始,使用相同的PDXType对foo.GenericClass执行所有操作

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

  • 名称=地址行1,值=123 Main St
  • 名称=城市,值=地图
是否仍然可以使用同一个域对象将数据插入不同的区域,并在序列化过程中注册它们自己的PDX类型?我是不是错过了一些简单的事情

拉贾尼坎特 你会分享你的类的源代码,以及它们是如何被实例化来拥有这些值的?带有“name”和“value”字段的简单Java类不应该像这样序列化。另外,您使用的是ReflectionBaseAutoSerializer、Spring序列化程序还是其他什么?

Rajanikanth 你会分享你的类的源代码,以及它们是如何被实例化来拥有这些值的?带有“name”和“value”字段的简单Java类不应该像这样序列化。另外,您使用的是ReflectionBaseAutoSerializer、Spring序列化程序还是其他什么?

您好@rajanikanth

正如Bruce所指出的,提供的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]]
虽然我能够理解创建
GenericClass
以避免显式定义域模型和关心如何处理更改的好处,但我只能认为这种数据建模方法是不可伸缩的

虽然PCC是一个键值存储,但我只能想象您的区域定义必须类似于
region
。这实际上不允许优化使用缓存技术,如果查找是如此细粒度的话。或者您的预期用途更像:

UserObject:
  _cacheName: String
  data: Set<GenericClass>
现在,如果您不想搜索任何特定的用户属性,那么使用这种方法是“可以接受的”。但是,如果您想使用一定量的查询功能来查找姓氏为“海绵”的所有用户或30岁以下的用户,那么这种方法将非常低效。 另外,查看所描述的GenericClass,您也可以使用:

GenericClass:
  _cacheName: String
  jsonDocument: String
你好,rajanikanth

正如Bruce所指出的,提供的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]]
虽然我能够理解创建
GenericClass
以避免显式定义域模型和关心如何处理更改的好处,但我只能认为这种数据建模方法是不可伸缩的

虽然PCC是一个键值存储,但我只能想象您的区域定义必须类似于
region
。这实际上不允许优化使用缓存技术,如果查找是如此细粒度的话。或者您的预期用途更像:

UserObject:
  _cacheName: String
  data: Set<GenericClass>
现在,如果您不想搜索任何特定的用户属性,那么使用这种方法是“可以接受的”。但是,如果您想使用一定量的查询功能来查找姓氏为“海绵”的所有用户或30岁以下的用户,那么这种方法将非常低效。 另外,查看所描述的GenericClass,您也可以使用:

GenericClass:
  _cacheName: String
  jsonDocument: String

非常感谢您的回复。我意识到这不是你提到的有效方法,当我深入到问题的更详细部分时。通过将我拥有的每个定义包装到其特定的域模型中来修改代码。现在可以了。非常感谢您的回复。我意识到这不是你提到的有效方法,当我深入到问题的更详细部分时。通过将我拥有的每个定义包装到其特定的域模型中来修改代码。现在好了,谢谢你,布鲁斯。这就是我意识到的,并采取了不同的方法。谢谢布鲁斯。这就是我意识到的,并采用了不同的方法。