Java Infinispan 10.1-将项目附加到远程缓存中的列表对象不起作用

Java Infinispan 10.1-将项目附加到远程缓存中的列表对象不起作用,java,infinispan,Java,Infinispan,而尝试列出缓存中存储的对象的一个新项对键不起作用 // Setup up a clustered cache manager ConfigurationBuilder builder = new ConfigurationBuilder(); builder.addServer().host("127.0.0.1").port(11322).marshaller(new JavaSerializationMarshaller()).addJavaSerialWhiteList(

而尝试列出缓存中存储的对象的一个新项对键不起作用

// Setup up a clustered cache manager
    ConfigurationBuilder builder = new ConfigurationBuilder();

    builder.addServer().host("127.0.0.1").port(11322).marshaller(new JavaSerializationMarshaller()).addJavaSerialWhiteList("java.util.List", "java.util.ArrayList");
    // Connect to the server
    RemoteCacheManager cacheManager = new RemoteCacheManager(builder.build());
    // Create test cache, if such does not exist
    cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache("test123", DefaultTemplate.DIST_SYNC);
    // Obtain the remote cache
    RemoteCache<String, List<String>> cache = cacheManager.getCache("test123");
    List<String> test = new ArrayList<String>();
    cache.put("key", test);
//设置群集缓存管理器
ConfigurationBuilder=新的ConfigurationBuilder();
builder.addServer().host(“127.0.0.1”).port(11322).marshaller(新的JavaSerializationMarshaller()).addJavaSerialWhiteList(“java.util.List”、“java.util.ArrayList”);
//连接到服务器
RemoteCacheManager cacheManager=新的RemoteCacheManager(builder.build());
//创建测试缓存(如果不存在)
cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(“test123”,DefaultTemplate.DIST\u SYNC);
//获取远程缓存
RemoteCache cache=cacheManager.getCache(“test123”);
列表测试=新建ArrayList();
cache.put(“key”,test);
将数据附加到列表中:

    for (int i = 0; i < 10; i++) {
        cache.get("key").add("1234");
    }
for(int i=0;i<10;i++){
cache.get(“key”).add(“1234”);
}
cache.get(“key”)的输出是
[]


当使用Widlfly 10的infinispan实现时,上述方法有效,但在infinispan 10.1 standalone中尝试同样的方法无效,请突出显示是否需要进行任何配置。

如果在本地模式下使用与嵌入式缓存类似的东西-
cache.get(…)
出于效率原因返回存储的对象本身。如果您为远程(热棒)客户端配置客户端缓存,我不确定这是否也可以工作

但是,在所有集群模式(复制、分布式)和远程模式下,
cache.get(…)
只返回存储对象的副本。此副本通常是存储在缓存中的对象反序列化的结果。任何突变都不会反映在缓存中,也不会反映在后续检索返回的任何对象中。修改缓存时需要显式


在向列表中添加元素时,您当然不希望调用任何同步操作10次,但在列表完成后会更新缓存一次。

如果您在本地模式下使用类似于嵌入式缓存的东西-
cache,这可能会起作用。出于效率原因,get(…)
会返回存储的对象本身。如果您为远程(热棒)客户端配置客户端缓存,我不确定这是否也可以工作

但是,在所有集群模式(复制、分布式)和远程模式下,
cache.get(…)
只返回存储对象的副本。此副本通常是存储在缓存中的对象反序列化的结果。任何突变都不会反映在缓存中,也不会反映在后续检索返回的任何对象中。修改缓存时需要显式


在向列表中添加元素时,您当然不想调用任何同步操作10次,但在列表完成后会更新缓存一次。

谢谢您的评论,那么,在行业中,以集群模式解决列表对象修改的最佳实践是什么呢?即,对于从不同节点同时添加的相同关键项,您应该执行cache.get(…)、mutate list,然后cache.put(…),所有这些操作都集中在一个事务中。如果存在并发修改,则除一个事务外,所有事务都将失败(假设为乐观锁定模式)。感谢您的评论,那么在集群模式下解决列表对象修改的最佳实践是什么,即对于相同的关键项,同时从不同的节点添加,您应该执行cache.get(…),对列表进行变异,然后缓存.put(…),所有这些都在一个事务中。如果存在并发修改,则除一个事务外,所有事务都将失败(假设采用乐观锁定模型)。