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(…),所有这些都在一个事务中。如果存在并发修改,则除一个事务外,所有事务都将失败(假设采用乐观锁定模型)。