Обновление реляционных данных в Hazelcast

Допустим, у меня есть следующие объекты:

Bar bar = new Bar();
bar.setX(3);
Foo foo = new Foo();
foo.setY(4);
foo.setBar(bar);

hzFooMap.put(1, foo);
hzBarMap.put(1, bar);

С приведенным выше кодом Hazelcast потеряет связь между foo и bar. Например, если я обновлю панель, то foo также не будет обновляться, например:

Bar sameBar = hzBarMap.get(1);
sameBar.setX(20);
hzBarMap.put(1, sameBar);
Foo sameFoo = hzFooMap.get(1);

в приведенном выше примере sameFoo.bar.x никогда не обновлялось с новым значением 20. Есть ли в Hazelcast способ обновить каждый экземпляр?

Я мог бы написать свой собственный движок, который помнит, где все хранится, и обновляет КАЖДЫЙ экземпляр каждого найденного объекта, но это сделало бы запись слишком дорогой.

Или я мог бы как-то сделать указатели между картами, но это замедлило бы чтение... Буду очень признателен за любую помощь в решении этой проблемы!


person user972276    schedule 08.03.2016    source источник


Ответы (1)


Hazelcast не является реляционной базой данных. Вы должны переосмыслить то, как вы потребляете свои данные.

Поскольку доступ к объекту в IMap относительно дешев, вы можете попробовать иметь одну карту по типам объектов и хранить ключ в зависимостях вместо целевого объекта. Или используйте какой-нибудь «умный указатель», который автоматически разрешает этот ключ.

Но afaik Hazelcast не имеет ничего для управления отношениями между объектами. Если вы действительно полагаетесь на такого рода свойства, то, возможно, Hazelcast не адаптирован для вас.

person Jérémie B    schedule 08.03.2016
comment
Разрешает ли HZ рекурсивные вызовы map.get()? Например, если бы я попытался сделать какой-то суперуказатель, мне нужно было бы снова собрать объект, прежде чем я вернусь из map.get(...). Я пробовал это в прошлом, получая ошибки threadstateexcepton из-за того, что один поток пытается получить доступ к нескольким разделам. - person user972276; 09.03.2016