持续可用性,JPA不一致的第一级或第二级缓存

时间:2013-10-23 15:18:42

标签: spring hibernate caching jpa

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

目前,有关这种架构中存在危险的新论点被提出来:

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

关于第一级缓存:

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

关于二级缓存:

二级缓存意味着在多个entityManager之间共享数据(它可以被视为内存映射中的一个大 ,其中entityManager可以“获取”实体数据,而不是运行查询DB)

JPA2中的二级缓存是可选的。如果您正在使用hibernate并且需要二级缓存,则必须设置类似ehcache的东西以支持二级缓存。否则你将没有二级缓存(BTW,如果任何JPA供应商默认启用内置的二级缓存,我会感到惊讶。)

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


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