有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Infinispan,版本化操作返回不正确的结果

我们计划在客户机-服务器模式下使用Infinispan。该体系结构有许多客户端(客户端1、客户端2等)和分布式infinispan网络

我们需要定期更新缓存中的数据,比如每5小时更新一次。所有客户端都可以更新数据。如果其中一个(比如客户端1)正在更新,我们需要阻止其他人做同样的工作。更新完成后,所有客户端将再等待5个小时,其中任何客户端都将再次执行更新

在测试过程中,为该方法提供结果是无效的

String key="test";
RemoteCacheManager cacheManager = new RemoteCacheManager();
RemoteCache<String, Object> remoteCache = cacheManager.getCache("MyCache");
remoteCache.put(key, new Object());
for (int i = 1; i < 5; i++) {
        System.out.println("version Before:" + remoteCache.getVersioned(key).getVersion());
        System.out.println("version to put:"+(i));
        System.out.println(remoteCache.replaceWithVersion(key, new Object(),i));
        System.out.println("version after:" + remoteCache.getVersioned(key).getVersion());
        System.out.println("---------------------");
}

这给出了正确的结果,比如

version Before:1
version to put:1
true
version after:2
---------------------
version Before:2
version to put:2
true
version after:3
---------------------
version Before:3
version to put:3
true
version after:4
---------------------

但是,一旦我向同一缓存添加了一个新的不同密钥,旧密钥的版本就给出了错误的结果

for (int i = 1; i < 5; i++) {
    remoteCache.put("Hello", new Object());
    System.out.println("version Before:" + remoteCache.getVersioned(key).getVersion());
    System.out.println("version to put:"+(i));
    System.out.println(remoteCache.replaceWithVersion(key, new Object(),i));
    System.out.println("version after:" + remoteCache.getVersioned(key).getVersion());
    System.out.println("---------------------");

}

version Before:1
version to put:1
true
version after:3
---------------------
version Before:3
version to put:2
false
version after:3
---------------------
version Before:3
version to put:3
true
version after:6
---------------------
version Before:6
version to put:4
false
version after:6
---------------------

看起来版本正在更改,与密钥无关,但与缓存无关。因为在插入不同的密钥以缓存现有密钥的版本时也会发生更改

更新:-这不是一个bug,这是预期的行为,请参阅答案及其讨论


共 (1) 个答案

  1. # 1 楼答案

    这是预期的行为。当您将一个新条目写入缓存时,它将获得一个新版本。新版本是从原子计数器获得的,它确保总是生成一些新版本。除非调用getWithVersion,否则无法了解此新版本