哪个是最好的Spring缓存抽象还是Hibernate缓存?

哪个是最好的Spring缓存抽象还是Hibernate缓存?,spring,hibernate,ehcache,Spring,Hibernate,Ehcache,我计划在web应用程序中实现缓存 我已经在以前的一个web应用程序中使用了Hibernate EHCache 最近几天,我知道在最新的Spring版本中有一个缓存抽象层 因此,我想知道它是HibernateEHCache的包装器还是Spring本身提供的缓存特性 如果不同,那么您想知道使用缓存的最佳或更好选项是什么 另外,我从几篇文章中了解到HibernateEhcache不支持集群,是吗?因为大型Web应用程序需要集群 我在Web应用程序中使用了Spring3.1和Hibernate3.3。H

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

我已经在以前的一个web应用程序中使用了Hibernate EHCache

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

因此,我想知道它是HibernateEHCache的包装器还是Spring本身提供的缓存特性

如果不同,那么您想知道使用缓存的最佳或更好选项是什么

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


我在Web应用程序中使用了Spring3.1和Hibernate3.3。

Hibernate和EHCache是不同的东西

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

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

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

EHCache提供了几种模式的分发(集群),从基本的JMS驱动的同步到terracottabigmemory分发。Hibernate二级缓存应该支持集群


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

Hibernate缓存继续使用EHCache(或其他缓存提供程序)与Spring一起工作。它提供了一个二级缓存,用于存储em.find(key)实体和关系(@cache annotations或XML),如果您使用q.setHint(“org.hibernate.cacheable”,true),它还提供了查询缓存。这些都是集成的,并且有很好的文档记录。对此,不需要Spring缓存

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

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


注意2:对于高度分布式的系统,如果不了解缓存的使用方式,则不建议使用Hibernate查询缓存。由于使用Hibernate维护的共享实体时间戳缓存来跟踪何时应收回缓存的查询结果,这增加了死锁的风险。

仅添加一点,对于使用Hibernate的数据库级缓存,Hibernate/JPA二级缓存似乎更合适。因为它在持久性上下文级别(JPAAPI)在实体级别管理数据缓存,所以数据库和缓存不一致的可能性非常小,因为hibernate管理得很好

但是,如果我们使用spring cache进行数据库缓存,那么我们必须始终确保在数据库上操作的每个方法都需要使用适当的缓存注释进行注释(例如,
@cacheexecute
用于删除),因此有可能丢失注释并导致不一致


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

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