【问题标题】:Which is best Spring Cache Abstraction or Hibernate EHCache?哪个是最好的 Spring Cache Abstraction 或 Hibernate EHCache?
【发布时间】:2013-01-16 15:17:17
【问题描述】:

我打算在 web 应用程序中实现缓存。

我已经在我之前的一个 Web 应用程序中使用过 Hibernate EHCache。

最近几天,我才知道在最新的 Spring 版本中有缓存抽象层。

因此我想它只是 Hibernate EHCache 的包装器还是 Spring 本身提供的缓存功能。

如果不同,那么想知道哪个是使用缓存的最佳或更好的选择?

另外,我从几篇文章中了解到 Hibernate EHCache 不支持集群,是吗?因为大型 Web 应用程序需要集群。

我在 Web 应用程序中使用过 Spring 3.1 和 Hibernate 3.3。

【问题讨论】:

  • 亲爱的投反对票的人,请告诉我投反对票的原因吗?
  • 是的,必须有办法让提问者知道为什么他的问题被否决

标签: spring hibernate ehcache


【解决方案1】:

Hibernate 和 EHCache 是不同的东西。

EHCache 是缓存提供者,即缓存的实际实现。

Hibernate 可以使用多个不同的 L2 缓存提供程序,包括 EHCache。

Spring Cache 是一个用于缓存方法调用的框架。它可以使用多个不同的提供者,包括 EHCache。

EHCache 以多种模式提供分布(集群),从基本的 JMS 驱动同步到 Terracotta BigMemory 分布。 Hibernate L2 缓存应该支持集群。

Spring Cache 与 Hibernate 无关,但您可以将 Hibernate L2 缓存和 Spring Cache(方法缓存)与 EHCache 并行用作两者的底层提供者。

【讨论】:

    【解决方案2】:

    Hibernate 缓存继续使用 EhCache(或其他缓存提供程序)与 Spring 一起工作。它提供了一个二级缓存,用于存储 em.find(key) 实体和关系(@Cache 注释或 XML),如果您使用 q.setHint("org.hibernate.cacheable",true),它还提供查询缓存。这些是集成的和有据可查的。不需要 Spring 缓存。

    但是 Spring 提供了独立于 Hibernate 缓存的方法缓存,并且仍然可以使用 EhCache 作为缓存提供者(与 Hibernate 共享 EhCache)。这可能有点令人困惑,因为 EhCache 配置是重叠的,但本质上 Spring Caching 允许您独立缓存标记为 @Cacheable 的方法的结果。

    注 1:Spring/Method 缓存未与 Hibernate 集成。 Hibernate 无法识别或维护使用方法缓存缓存的结果。

    注意 2:如果没有很好地了解缓存的使用方式,不建议将 Hibernate 查询缓存用于高度分布式系统。由于使用 Hibernate 维护的共享实体时间戳缓存来跟踪缓存的查询结果何时应该被驱逐,它会增加死锁的风险。

    【讨论】:

      【解决方案3】:

      补充一点,对于使用 hibernate 的数据库级缓存,hibernate/JPA 二级缓存似乎更合适。因为它在持久化上下文级别(JPA API)的实体级别管理数据缓存,所以数据库和缓存不一致的机会非常少,因为 hibernate 管理得很好。

      但是如果我们使用spring cache进行数据库缓存,那么我们总是要确保每个操作数据库的方法都需要用适当的缓存注解进行注解(例如@CacheEvict表示remove),这样就有可能丢失注解并造成不一致。

      此外,spring cache 只能用于公共方法,因为它支持我的 AOP(我们可以使用 AspectJ 来解决这个问题)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 2016-09-08
        • 2012-08-07
        相关资源
        最近更新 更多