我们希望有2个运行相同Web应用程序的tomcat服务器。 我们将HA-Proxy作为负载均衡器\代理来管理连接\流量\会话。
目前,有关这种架构中存在危险的新论点被提出来:
如果你有两个并排运行的tomcats实例,并且使用与JPA持久性管理器相同的数据源(例如mySQL), 您可能遇到缓存同步问题,因为JPA使用内置的第1级和第2级缓存。
换句话说,由于2个JPA实体管理器在不同的tomcats中处于活动状态,因此您将遇到同步问题。 (当第二个缓存发生变化时,如何知道自己的缓存是否有效?)
这是一个真正的问题吗?有没有办法配置一些东西才能使它工作? 如果没有,我有什么选择?
谢谢!
答案 0 :(得分:0)
关于第一级缓存:
第一级缓存是与您的entityManager的持久性上下文绑定。如果你不使用扩展的PersistenceContext(或者如果你不知道它是什么),那么你就可以了,因为你的持久化上下文永远不会比一个请求 - 响应循环活得更久。 (如果是这种情况,你可能有更重要的设计问题)。
关于二级缓存:
二级缓存意味着在多个entityManager之间共享数据(它可以被视为内存映射中的一个大 ,其中entityManager可以“获取”实体数据,而不是运行查询DB)
JPA2中的二级缓存是可选的。如果您正在使用hibernate并且需要二级缓存,则必须设置类似ehcache的东西以支持二级缓存。否则你将没有二级缓存(BTW,如果任何JPA供应商默认启用内置的二级缓存,我会感到惊讶。)
所以如果你没有启用二级缓存:没问题。 如果启用二级缓存,则必须正确设置它,以便在某些数据更改时向所有实例广播消息(使用ehcahe:它表示在ehcache xml配置文件中声明广播和侦听器)。
我很惊讶;-),但似乎有些JPA供应商默认启用二级缓存(DataNucleus)......如果你不处理它:你可能在分布式架构中遇到麻烦。