2

我计划在 Web 应用程序中实现缓存。

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

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

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

如果不同,那么想知道使用 Cache 的最佳或更好的选择是什么?

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

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

4

3 回答 3

3

Hibernate 和 EHCache 是不同的东西。

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

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

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

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

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

于 2013-01-16T15:38:22.080 回答
0

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 维护的共享实体时间戳缓存来跟踪缓存的查询结果何时应该被驱逐,它增加了死锁的风险。

于 2016-09-15T15:57:18.880 回答
0

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

但是如果我们使用spring cache来做数据库缓存,那么我们总是要保证每一个对数据库操作的方法都需要用合适的缓存注解进行注解(比如@CacheEvictremove),这样就有可能会丢失注解,造成不一致。

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

于 2019-10-13T11:37:11.443 回答