任何人都可以解释休眠二级缓存与弹簧缓存有什么区别。?
在单个应用程序中同时使用两者是否有意义?如果不推荐,那么何时使用哪一个?
如果有人给出基于现实生活场景的解释,它可以帮助您轻松理解。
任何人都可以解释休眠二级缓存与弹簧缓存有什么区别。?
在单个应用程序中同时使用两者是否有意义?如果不推荐,那么何时使用哪一个?
如果有人给出基于现实生活场景的解释,它可以帮助您轻松理解。
这是两种完全不同的技术。当您使用关系数据库时,Hibernate 和 Hibernate Cache 通常适用。然后就可以使用Hibernate ORM来生成查询、存储对象等。领域模型是用java(entities)写的。有时将其中一些实体缓存在内存中以加快查询速度是有意义的,因此您可以使用 Hibernate Cache 缓存它们。那里有许多不同类型的缓存,我不会深入细节,因为这是一个普遍的问题,但如果你想了解更多关于 Hibernate 缓存的信息,请阅读这里
现在 Spring 缓存由 Spring 完成,一般来说,它与关系数据库/JDBC 世界无关,换句话说,在 Hibernate 领域之外。您可以缓存一个对象以避免,例如,调用 MongoDb,或者避免进行两次昂贵的计算。您可以将数据缓存在内存中或更高级的分布式技术中,例如 Hazelcast、Redis 或 Infinispan(还有其他)。
在这里,您可以找到 Spring Caching 的介绍材料。这是一种更完整的官方文档
所以是的,要直接回答您的问题,在单个应用程序中使用两者可能是有意义的:) 我真的认为您应该熟悉两者,至少在概念及其目标层面上,然后决定什么适用于你的情况。
它们的主要区别之一是休眠 2 级缓存将在缓存实体有任何更新或删除时自动帮助维护缓存的实体,而 Spring 缓存是一种更通用的缓存,它对 Hibernate 一无所知,因此您必须使在这种情况下手动过时的缓存实体。
此外,由 Hibernate 二级缓存缓存的实体将由它管理,而在 spring-cache 中它将被分离。如果您不熟悉它,处理分离的实体并不容易。
使用两个缓存是否有意义总是取决于上下文。对我来说,使用 Hibernate 二级缓存需要一些学习曲线才能正确使用它。Spring 缓存由于其通用性而更加灵活,但它需要自己做更多的工作。
我会首先使用 Hibernate 二级缓存,因为一旦你掌握了它,它就需要做更少的事情。如果遇到 Hibernate 不支持配置我想要的缓存行为的情况,请考虑使用 Spring 缓存。
我的真实例子是我有一些后台数据清理任务,需要执行一些本机查询,这会导致从二级缓存中删除所有实体,这反过来会影响我的休眠查询缓存之一。由于本机查询非常复杂,即使使用此处提到的技巧,我也无法控制不使缓存无效。所以我改为使用 Spring 缓存来缓存该查询结果。
他们完全不同
Hibernate 二级缓存是在 Hibernate 的上下文中使用的,所以所有的 session 共享同一个实例。默认情况下它是禁用的,为了使用它,你应该像这样启用它:
hibernate.cache.use_second_level_cache=true
为了使实体有资格进行二级缓存,我们使用 Hibernate 特定的 @org.hibernate.annotations.Cache 注释对其进行注释,并指定缓存并发策略。
一些开发人员认为添加标准的 @javax.persistence.Cacheable 注释也是一个很好的约定(尽管 Hibernate 不需要),因此实体类实现可能如下所示:
例子
@Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Foo {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
private long id;
@Column(name = "NAME")
private String name;
// getters and setters
}
如果 Hibernate 二级缓存用于缓存 JPA 实体的实例和查询结果,则 Spring 缓存旨在缓存 Spring bean。
例子
@Cacheable("addresses")
public String getAddress(Customer customer) {...}
getAddress() 调用将在实际调用方法之前首先检查缓存地址,然后缓存结果。
我希望我的解释很清楚