纪事地图更新持久值

时间:2017-11-09 17:38:21

标签: dictionary persist chronicle chronicle-map

我需要更新持久值。 我的意思是:

//////类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方法是无用的

有人知道如何更改此值吗?

2 个答案:

答案 0 :(得分:1)

在Chronicle Map中存储值时,它会被序列化为堆外内存;因此,当您致电get()时,您将检索另一个(尽管值相等)实例。

如果您需要使用同一个实例,那么您应该考虑使用内存解决方案(例如j.u.HashMapj.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