当尝试将一个新的项目存储到列表对象中时,Cache中的Key没有反映出来。
// 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);
将数据添加到列表中。
for (int i = 0; i < 10; i++) {
cache.get("key").add("1234");
}
的输出 cache.get("key")
是 []
当使用Infinispan实现Widlfly 10以上的方法工作,但尝试同样的Infinispan 10.1单机版是不工作,请强调,如果任何配置需要做。
如果您在本地模式下使用类似于嵌入式缓存的东西,这可能会奏效。cache.get(...)
为了提高效率,返回存储对象本身。我不确定如果你为远程(Hot Rod)客户端配置了客户端缓存是否也可以工作。
然而,在所有集群模式下(复制的,分布式的),以及在远程的情况下。cache.get(...)
只返回存储对象的副本。这个副本通常是存储在缓存中的对象反序列化的结果。任何突变既不会反映在缓存中,也不会反映在后续检索返回的任何对象中。在修改缓存的时候,你需要明确。
而且你肯定不希望在向列表中添加元素时调用任何同步操作10次,但在列表完成后更新一次缓存。