我需要更新持久值。 我的意思是:
//////类InfoEquipoCache用作CM的值
class InfoEquipoCache implements BytesMarshallable {
private EquipoCache equipoCache;
public void actualiza() {
.....
equipoCache.actualiza()
......
}
.......
///// Principal Class有一个InfoEquipoCache的CM
ChronicleMap<String, InfoEquipoCache> equipos;
..... ////在校长班的某些部分:
equipos.get(idEquipo).actualiza() //InfoEquipoCache contains actualiza method
但是,equipos.get(idEquipo)有一个EquipoCache的参考,而InfoEquipoCache里面有一个不同的EquipoCache参考。结果realiza方法是无用的
有人知道如何更改此值吗?
答案 0 :(得分:1)
在Chronicle Map中存储值时,它会被序列化为堆外内存;因此,当您致电get()
时,您将检索另一个(尽管值相等)实例。
如果您需要使用同一个实例,那么您应该考虑使用内存解决方案(例如j.u.HashMap
或j.u.c.ConcurrentHashMap
)。
答案 1 :(得分:0)
您可以在 Chronicle Map 内部存储和更新堆外的 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
}
}
您也可以在编年史地图中阅读此内容tutorial