Java Hibernate-群集缓存和更新类版本
我们使用Ehcache作为集群中Hibernate的二级缓存。由于我们一个接一个地更新服务器以避免停机,因此在某些情况下,集群中可能有一台服务器运行的是较旧版本的代码,而另一台服务器运行的是更新版本的代码 我以为问题出在Ehcache上,但我把范围缩小到Hibernate。Hibernate不缓存整个实体,而是缓存字段值数组。所以,如果将具有不同模式的实体复制到缓存中,那么当盲目复制阵列时,在加载时会发生不好的事情 我无法在Ehcache级别停止此操作。我曾想过在实体类上设置serialVersionUID,但这对那些较低级别的数组不起作用Java Hibernate-群集缓存和更新类版本,java,hibernate,caching,Java,Hibernate,Caching,我们使用Ehcache作为集群中Hibernate的二级缓存。由于我们一个接一个地更新服务器以避免停机,因此在某些情况下,集群中可能有一台服务器运行的是较旧版本的代码,而另一台服务器运行的是更新版本的代码 我以为问题出在Ehcache上,但我把范围缩小到Hibernate。Hibernate不缓存整个实体,而是缓存字段值数组。所以,如果将具有不同模式的实体复制到缓存中,那么当盲目复制阵列时,在加载时会发生不好的事情 我无法在Ehcache级别停止此操作。我曾想过在实体类上设置serialVers
我如何向Hibernate表明实体版本已更改,并且不应加载缓存中的值?我认为在这种情况下,您无法避免容量的临时降级,因为这里的系统运行的服务器具有不兼容的代码基 即使您可以评估实体格式及其缓存版本的不兼容性,而不从缓存加载它,但最终的结果是,一些机器将从缓存中读取/写入数据,而一些机器将直接进入数据库,这将导致不一致的数据访问,等等。基本上,这种方法是一堆蠕虫 有更好的解决办法。这些步骤包括: 断开一半群集与网络的连接。您可以使用交换机或负载平衡器的管理或任何其他可用方法。 把那一半拿下来,升级,拿上来。 把它接回去。 断开第二个插头。 重复2和3。 您在这里得到的是暂时性的容量降低,同时在升级时仍保持系统可用以满足客户请求。它可以在非高峰时间正常工作。随着可用性的增加,您可以通过将新请求路由到集群的升级部分来增强它。有其他的变化,但想法是相同的-分而治之 唯一重要的是,新集群和旧集群不应该相互对话。你的行动需要帮助,但这肯定是可行的 希望这有帮助 斯拉瓦·伊梅舍夫
我认为在这种情况下,您无法避免容量的临时降级,因为您这里的系统运行的服务器具有不兼容的代码库 即使您可以评估实体格式及其缓存版本的不兼容性,而不从缓存加载它,但最终的结果是,一些机器将从缓存中读取/写入数据,而一些机器将直接进入数据库,这将导致不一致的数据访问,等等。基本上,这种方法是一堆蠕虫 有更好的解决办法。这些步骤包括: 断开一半群集与网络的连接。您可以使用交换机或负载平衡器的管理或任何其他可用方法。 把那一半拿下来,升级,拿上来。 把它接回去。 断开第二个插头。 重复2和3。 您在这里得到的是暂时性的容量降低,同时在升级时仍保持系统可用以满足客户请求。它可以在非高峰时间正常工作。随着可用性的增加,您可以通过将新请求路由到集群的升级部分来增强它。有其他的变化,但想法是相同的-分而治之 唯一重要的是,新集群和旧集群不应该相互对话。你的行动需要帮助,但这肯定是可行的 希望这有帮助 斯拉瓦·伊梅舍夫