Обновление хроники-карты сохранилось
Мне нужно обновить постоянное значение. Я имею в виду:
////// Класс InfoEquipoCache используется в качестве значения CM
class InfoEquipoCache implements BytesMarshallable {
private EquipoCache equipoCache;
public void actualiza() {
.....
equipoCache.actualiza()
......
}
.......
///// Основной класс имеет CM InfoEquipoCache
ChronicleMap<String, InfoEquipoCache> equipos;
..... //// В какой-то части основного класса:
equipos.get(idEquipo).actualiza() //InfoEquipoCache contains actualiza method
Но equipos.get(idEquipo) имеет ссылку на EquipoCache, а внутри InfoEquipoCache - другую ссылку на EquipoCache. По результатам актуализации метод бесполезен
Кто-то знает, как внести изменения в это значение?
2 ответа
Когда вы сохраняете значение в Chronicle Map, оно сериализуется в память вне кучи; поэтому, когда вы звоните get()
вы будете получать другой (хотя и равный по значению) экземпляр.
Если вам нужно работать с одним и тем же экземпляром, вы должны рассмотреть решение в памяти (например, j.u.HashMap
или же j.u.c.ConcurrentHashMap
).
Вы можете хранить и обновлять значение EquipoCache вне кучи внутри карты хроник. Не забудьте записать значение обратно в CM в конце работы.
try (ExternalMapQueryContext<String, InfoEquipoCache, ?> ctx = map.queryContext(idEquipo)) {
ctx.updateLock().lock();
try {
MapEntry<String, InfoEquipoCache> entry = ctx.entry();
if (entry != null) {
InfoEquipoCache infoEquipoCache = entry.value().get();
infoEquipoCache.actualiza();
ctx.replaceValue(entry,ctx.wrapValueAsData(infoEquipoCache));
}
} finally {
ctx.readLock().unlock(); //release all-type locks
}
}
Также вы можете прочитать это в карте хроник.учебнике по