1

我需要更新一个持久值。我是说:

////// 类 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 引用。由于结果实际化方法是无用的

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

4

2 回答 2

1

当你在 Chronicle Map 中存储一个值时,它会被序列化到堆外内存;因此,当您调用时,get()您将检索一个不同的(尽管value-equal)实例。

如果您需要使用相同的实例,那么您应该考虑使用内存解决方案(例如j.u.HashMapj.u.c.ConcurrentHashMap)。

于 2017-11-10T06:48:00.143 回答
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
    }
}

您也可以在编年史地图教程中阅读此内容

于 2021-07-20T12:49:16.250 回答