哪个是最好的Spring Cache Abstraction或Hibernate EHCache?

时间:2013-01-16 15:17:18

标签: spring hibernate ehcache

我打算在Web应用程序中实现Cache。

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

现在有一天,最近我开始知道在最新的Spring版本中有Cache Abstraction层。

因此我想它只是Hibernate EHCache的包装器,或者是Spring自己提供的Cache功能。

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

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

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

3 个答案:

答案 0 :(得分:2)

Hibernate和EHCache是​​不同的东西。

EHCache是​​缓存提供程序,即缓存的实际实现。

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

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

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

Spring Cache与Hibernate无关,但你可以将Hibernate二级缓存和Spring Cache(方法缓存)与EHCache并行使用,作为两者的基础提供者。

答案 1 :(得分:0)

Hibernate缓存继续使用EhCache(或其他缓存提供程序)与Spring一起使用。它提供了一个二级缓存,用于存储em.find(键)实体和关系(@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 Query缓存。它增加了由于使用Hibernate维护的共享实体时间戳缓存而导致死锁的风险,以跟踪缓存查询结果何时应该被驱逐。

答案 2 :(得分:0)

只需添加一下,对于使用hibernate的数据库级缓存,hibernate / JPA二级缓存似乎更合适。由于它在持久性上下文级别(JPA API)上在实体级别管理数据缓存,因此数据库和缓存的不一致几率很小,因为休眠管理得很好。

但是,如果我们使用Spring缓存进行数据库缓存,那么我们总是必须确保对数据库上运行的每个方法都需要使用适当的缓存注释进行注释(例如,@CacheEvict用于删除),因此有机会缺少注释并导致不一致。

此外,spring缓存只能在公共方法上使用,因为它支持我的AOP(尽管我们可以使用AspectJ来解决此问题)。