Gemfire - несколько регионов с использованием одного и того же доменного объекта

Мы используем Gemfire PCC в качестве одного из наших общих решений для кэширования. Где клиенты будут использовать gemfire в качестве службы кеширования. Для достижения этой цели у нас есть общая модель данных, определенная с полями имени и значения. Таким образом, для n регионов это будет один и тот же класс.

Проблема в том, что когда происходит первое размещение или размещение, тип PDXType для этого типа класса был зарегистрирован со вставленными полями. С этого момента каждый кеш использует один и тот же PDXType из-за того же типа класса.

Допустим, я вставил ниже запись Region1 - foo.GenericClass

  • имя = Имя, значение = 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 как имя поля в Region2.
Region2 - foo.GenericClass

  • имя = AddressLine1, значение = 123 Main St
  • имя = Город, значение = Атлата

Есть ли способ вставить данные в разные регионы, используя один и тот же объект домена, и зарегистрировать свои собственные типы PDXTypes во время сериализации? Я упустил здесь какую-то простую вещь?


person rajanikanth    schedule 06.07.2018    source источник


Ответы (2)


Раджаникант Не могли бы вы поделиться исходным кодом для своих классов и как они создаются для получения этих значений? Простой Java-класс с полями «имя» и «значение» не следует сериализовать таким образом. Кроме того, вы используете ReflectionBasedAutoSerializer, сериализатор Spring или что-то еще?

person Bruce Schuchardt    schedule 09.07.2018
comment
Спасибо, Брюс. Это то, что я понял и применил другой подход. - person rajanikanth; 13.07.2018

Привет, @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]]

Хотя я могу понять преимущество желания создать 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)}

Теперь использование этого подхода «приемлемо», если вы не заботитесь о поиске каких-либо конкретных свойств пользователя. НО этот подход будет ОЧЕНЬ неэффективным, если вы захотите использовать некоторое количество запросов, чтобы найти всех пользователей с lastName «Sponge» или пользователей младше 30 лет. Кроме того, глядя на описанный GenericClass, вы можете с таким же успехом использовать :

GenericClass:
  _cacheName: String
  jsonDocument: String
person Udo    schedule 09.07.2018
comment
Большое спасибо за ответ. Я понял, что это неэффективный способ, как вы упомянули, когда копались более подробно в проблеме. Изменил код, заключив каждое определение в его конкретную модель предметной области. Теперь все работает нормально. - person rajanikanth; 13.07.2018