1

我们希望有 2 个运行相同 Web 应用程序的 tomcat 服务器。我们将 HA-Proxy 作为负载平衡器\代理来管理连接 \traffic\sessions。

目前,关于这种架构的危险提出了一个新的论点:

如果您有 2 个并排运行的 tomcats 实例,并使用 JPA 持久性管理器使用相同的数据源(例如 mySQL),您可能会遇到缓存同步问题,因为 JPA 使用内置的 1 级和 2 级缓存。

换句话说,您将遇到同步问题,因为 2 个 JPA 实体管理器在不同的 tomcat 中处于活动状态。(当第二个缓存发生变化时,如何知道它自己的缓存无效?)

这是一个真正的问题吗?有没有办法配置某些东西以使其工作?如果没有,我有什么选择?

谢谢!

4

1 回答 1

0

关于一级缓存:

第一级缓存是与您的 entityManager 绑定的持久性上下文。如果您不使用扩展的 PersistenceContext(或者如果您不知道它是什么),那么这对您来说没问题,因为您的持久性上下文永远不会超过一个请求-响应循环。(如果是这种情况,您可能有更重要的设计问题)。

关于二级缓存:

2级缓存意味着在多个entityManager之间共享数据(它可以被看作是一个大内存映射,entityManager可以“获取”实体数据,而不是在数据库上运行查询)

二级缓存在 JPA2 中是可选的。如果您正在使用休眠并需要二级缓存,则必须设置像 ehcache 这样的东西来支持二级缓存。否则你将没有二级缓存(顺便说一句,如果任何 JPA 供应商提供默认启用的内置二级缓存,我会感到惊讶)。

所以如果你没有启用二级缓存:没问题。如果启用二级缓存,则必须正确设置它,以便在某些数据更改时向所有实例广播消息(使用 ehcahe:这意味着在 ehcache xml 配置文件中声明广播和侦听器)。


我很惊讶 ;-) ,但似乎一些 JPA 供应商默认启用二级缓存(DataNucleus)......如果你不注意它:你可能在分布式架构中遇到麻烦。

于 2013-10-23T15:41:53.030 回答