【问题标题】:Does ehcache respect serialVersionUID?ehcache 是否尊重 serialVersionUID?
【发布时间】:2011-08-17 20:35:17
【问题描述】:

我们在具有 RMI 复制和更新服务器的集群中运行 ehcache 1.5(想想顶部的负载平衡器/代理和零停机时间更新)。

我们通常不关心serialVersionUID。麻烦的是,如果您在复制缓存中有两个版本的实体,可能会发生非常糟糕的事情(直至中断)。也就是说,如果其中一台运行旧代码的服务器将元素复制到其类已更改的新服务器。

我们通常通过为不同端口上的更新服务器启动新集群来解决这个问题,但它非常丑陋和脆弱。

所以,问题是:集群、复制的 ehcache 是否正确尊重 serialVersionUID?也就是说,如果本地类的版本不同,它不会尝试复制实体吗?

感谢您的直观猜测,但我正在寻找尽可能可靠的数据,首选官方文档。

【问题讨论】:

标签: java serialization ehcache


【解决方案1】:

Ehcache 不支持您建议的 serialVersionUID。我在运行 Ehcache 独立运行和通过 Terracotta 分布式运行时亲身体验了您在上面描述的场景,如果版本 UID 不匹配,则会在客户端上引发异常。

理想情况下(我假设这就是您要查找的内容)与 serialVersionUID 不匹配的对象只会错过缓存,但不幸的是,这不受支持。

如果您正在寻找更优雅的解决方案来解决此问题,请尝试在更改缓存实体时更改缓存区域名称,可能会将其与 serialVersionUID 链接。您需要更新 ehcache 配置文件以添加新的缓存区域,但它会强制资源仅从包含它们支持的版本的缓存中请求实体。这对于无法同时使用新版本更新所有资源并且不想使缓存过期的分布式环境有很大帮助。

【讨论】:

  • 很抱歉没有外部文档,但我确信您已经发现有关此主题的信息很少。实验是最好的策略。
  • 你用的是什么版本?奇怪的是,我在 ehcache 论坛上得到了不同的答案。我想这留给我实验和源代码分析。
  • ehcache 2.3.0.我应该指定当 versionIds 不匹配时抛出异常的是 ehcache,与论坛帖子一致。
  • 好的,到底发生了什么?异常是可以的(只要它没有出现在应用程序级别)。这种情况是否有可能以任何方式“污染”任一节点上的缓存?我现在观察到的是来自一个节点的实体(复制为数组)在另一个节点上被反序列化,如果您删除或添加了一个字段,这可能会造成伤害。
  • 我的理解是,Ehcache 并不关心你给它的 Object 的 serialVersionUID 是什么——它只是将它转储到一个区域中。当你把它拿出来时,serialVersionUID 将像 Java 一样受到尊重,即如果 id 不匹配,它只会说你放入的对象不能反序列化为你拥有的当前对象。 -- 如果这个异常是可以的,那么你不必担心。只要知道您将继续收到它,直到您停止将旧版本放入缓存中。
猜你喜欢
  • 2013-08-18
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2012-06-10
相关资源
最近更新 更多