Hibernate - 集群缓存和更新类版本

时间:2011-08-24 08:57:08

标签: java hibernate caching

我们在集群中使用Ehcache作为Hibernate的L2缓存。由于我们逐个更新服务器以避免停机,因此在某个时刻,集群中的一个服务器可能运行旧版本的代码,另一个服务器运行更新版本。

我认为这个问题是Ehcache,但我把它缩小到了Hibernate。 Hibernate不缓存整个实体,而是缓存字段值的数组。因此,如果您将具有不同模式的实体复制到缓存中,那么糟糕的事情会在加载时发生,因为数组是盲目复制的。

我无法在Ehcache级别停止此操作。我想在我的实体类上设置serialVersionUID,但这对那些较低级别的数组不起作用。

如何指示Hibernate实体版本已更改且不应加载缓存中的值?

1 个答案:

答案 0 :(得分:0)

在这种情况下,我认为您无法避免容量暂时降级,因为您在这里拥有的是运行具有不兼容代码库的服务器的系统。

即使您可以评估实体格式与其缓存版本的不兼容性而不是从缓存中加载它,您最终会得到的结果是某些机器会读取/写入缓存,而某些机器会直接读取数据库将导致不一致的数据访问,等等。基本上,这种方法是一种蠕虫。

有更好的解决方案。步骤包括:

  1. 断开群集中一半的群集与网络的连接。您可以使用交换机或负载均衡器的管理或任何其他可用方法。
  2. 取下那一半,升级它,把它拿起来。
  3. 将其连接回来。
  4. 断开第二个。
  5. 重复#2和#3。
  6. 您所获得的是暂时降低容量,同时仍然保持系统可用于在升级时提供客户请求。它可以在非高峰时段很好地工作。您可以通过将新请求路由到群集的升级部分来增强它,因为它变得越来越可用。还有其他变化,但这个想法是相同的 - 分而治之。

    唯一重要的是新老集群不应该相互通信。你需要帮助你的操作,但它肯定是可行的。

    希望这有帮助。

    Slava Imeshev

    Cacheonix: Reliable Distributed Java Cache