我们在集群中运行ehcache 1.5并进行RMI复制并逐个更新服务器(想想顶部的负载均衡器/代理和零停机更新)。
我们通常不关心serialVersionUID
。麻烦的是,如果在复制缓存中有两个版本的实体,可能会发生非常糟糕的事情(直到中断)。也就是说,如果其中一个运行旧代码的服务器将一个元素复制到更改其类的新服务器。
我们通常通过为不同端口上的更新服务器启动新集群来解决这个问题,但它非常难看且非常脆弱。
所以,问题是:群集,复制的ehcache是否正确尊重serialVersionUID
?也就是说,如果本地类的版本不同,它是否不会尝试复制实体?
感谢直观的猜测,但我正在寻找尽可能的硬数据,官方文档首选。
答案 0 :(得分:2)
Ehcache不支持您建议的方式的serialVersionUID。我亲身经历了上面描述的场景,同时运行Ehcache独立并通过Terracotta分发,如果版本UID不匹配,将在客户端上抛出异常。
理想情况(我认为这就是你要找的东西)与serialVersionUID不匹配的对象只是会错过缓存,但遗憾的是这不支持。
如果您正在寻找稍微更优雅的解决方案,请尝试在更改缓存实体时更改缓存区域名称,也许将其与serialVersionUID相关联。您需要更新ehcache配置文件以添加新的缓存区域,但是它会强制资源仅从包含其支持的版本的缓存中请求实体。这对于分布式环境来说是一个很大的帮助,在这种环境中,您无法同时使用新版本更新所有资源,并且不希望使缓存过期。