【问题标题】:Continuous availability, 1st \2nd level caching of JPA inconsistency持续可用性,JPA 不一致的 1 级 \2 级缓存
【发布时间】:2013-10-24 02:32:19
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: spring hibernate caching jpa


    【解决方案1】:

    关于一级缓存:

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

    关于二级缓存:

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

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

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


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

    【讨论】:

    • 仅供参考,一些 JPA 实现默认提供 L2 缓存:DataNucleus JPA,我认为 EclipseLink 也是。显然,建议根据正在处理的精确情况配置 L2 缓存(例如,使用分布式缓存)
    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2014-06-21
    • 2013-03-05
    • 2020-09-27
    相关资源
    最近更新 更多