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

时间:2018-07-06 21:19:17

标签: pivotal-cloud-foundry gemfire geode spring-data-gemfire

我们将Gemfire PCC用于我们的通用缓存解决方案之一。客户将gemfire用作缓存服务的地方。为了实现这一点,我们使用名称,值字段定义了通用数据模型。因此,对于n个区域,它将是同一类。

问题是,当第一次放置put或putAll时,已使用插入的字段注册了该类类型的PDXType。从那以后,由于相同的类类型,每个缓存都使用相同的PDXType。

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

  • name =名字,value = Abc
  • 名称=姓氏,值=默认值

此后,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]]

从此处开始,使用相同的PDXType对foo.GenericClass进行所有操作。

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

  • name = AddressLine1,value = 123 Main St
  • name =城市,value =阿塔拉塔

是否有通过使用相同的域对象将数据插入不同区域并在序列化期间注册其自己的PDXType的方法?我在这里错过了一些简单的事情吗?

2 个答案:

答案 0 :(得分:2)

Rajanikanth 您是否将共享类的源代码以及如何实例化它们以具有这些值?具有“名称”和“值”字段的简单Java类不应像这样序列化。另外,您是否在使用ReflectionBasedAutoSerializer,Spring序列化程序或其他工具?

答案 1 :(得分:2)

你好,@ 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<Key,GenericClass>。如果查询的粒度如此,这实际上并不能最佳地利用缓存技术。或者您的预期用法是这样:

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)}

现在,如果您不希望搜索任何特定的用户属性,那么使用这种方法是“可接受的”。但是,如果您想使用某种数量的查询功能来查找姓氏为“ Sponge”的所有用户或30岁以下的用户,则此方法的效率将大大降低。 另外,查看描述的GenericClass,您可能会很好地使用:

GenericClass:
  _cacheName: String
  jsonDocument: String