Spring Data Jpa 缓存

简介: JPA仅仅只是一个规范,而不是产品;使用JPA本身是不能做到持久化的。所以,JPA只是一系列定义好的持久化操作的接口,在系统中使用时,需要真正的实现者,在这里,我们使用Hibernate作为实现者。

JPA仅仅只是一个规范,而不是产品;使用JPA本身是不能做到持久化的。所以,JPA只是一系列定义好的持久化操作的接口,在系统中使用时,需要真正的实现者,在这里,我们使用Hibernate作为实现者。
JPA规范中定义了很多的缓存类型:一级缓存,二级缓存,对象缓存,数据缓存

wiki的jpa缓存介绍

hibernate实现中只有三种缓存类型: 一级缓存,二级缓存和查询缓存。 在hibernate的实现概念里,他把什么集合缓存之类的统一放到二级缓存里去了。

1. 一级缓存

不需要有特殊配置。同一个session就行

2. 二级缓存

开启步骤

1:实体类直接打上 javax.persistence.Cacheable 标记。 (@Cacheable )

@Entity  
@Table(name ="tablename")  
@Cacheable  
public class XxxEntity{}  

2:加@cache

@Entity  
@Table(name ="tablename")  
@Cacheable  
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)  
public class XxxEntity{}  

另一种方法
1:实体类加@Cacheable
2:配置文件修改,在 jpaProperties 下添加,用ehcache来实现二级缓存
如:

<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>  
<prop key="javax.persistence.sharedCache.mode">ENABLE_SELECTIVE</prop>  

其他说明

<!--将hibernate的统计打开来看看到底是不是被缓存了。 -->
<prop key="hibernate.generate_statistics">true</prop>  
hibernate的 hibernate.cache.use_second_level_cache这个属性,只要有@cache标记,自动开启。

javax.persistence.sharedCache.mode的其他配置如下:

The javax.persistence.sharedCache.mode property can be set to one of the following values:
ENABLE_SELECTIVE (Default and recommended value): entities are not cached unless explicitly marked as cacheable.
DISABLE_SELECTIVE: entities are cached unless explicitly marked as not cacheable.
NONE: no entity are cached even if marked as cacheable. This option can make sense to disable second-level cache altogether.
ALL: all entities are always cached even if marked as non cacheable.
如果用all的话,连实体上的@cacheable都不用打,直接默认全部开启二级缓存

3查询缓存

一,二级缓存都是根据对象id来查找,如果需要加载一个List的时候,就需要用到查询缓存。

开启步骤

1.配置文件

<prop key="hibernate.cache.use_query_cache">true</prop>  

2.要在方法内打上@QueryHint来实现查询缓存

    @Query("from XxxEntity")  
    @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value ="true") })  
    List<XxxEntity> findAllCached();  

注意: 这样查询缓存是不会生效的,也就是spring-data-jpa默认实现的findAll()方法无法保存到查询缓存

    @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value ="true") })  
    List<XxxEntity> findAll(); 

4.集合缓存:就是二级缓存的一种

网上例子

`@Entity
@Table(name =”parent”)
@Cacheable
public class Parent extends IdEntity {

private static final long serialVersionUID = 1L;  
private String name;  
private List<Children> clist;  

public String getName() {  
    return name;  
}  
public void setName(String name) {  
    this.name = name;  
}  

@OneToMany(fetch = FetchType.EAGER,mappedBy = "parent")  
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)  
public List<Children> getClist() {  
    return clist;  
}  
public void setClist(List<Children> clist) {  
    this.clist = clist;  
}  

}

@Entity
@Table(name =”children”)
@Cacheable
public class Children extends IdEntity{

private static final long serialVersionUID = 1L;  
private String name;  
private Parent parent;  

@ManyToOne(fetch = FetchType.LAZY)  
@JoinColumn(name = "parent_id")  
public Parent getParent() {  
    return parent;  
}  

public void setParent(Parent parent) {  
    this.parent = parent;  
}  

public String getName() {  
    return name;  
}  

public void setName(String name) {  
    this.name = name;  
}     

} `

相关文章
|
1月前
|
存储 缓存 Java
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
|
3月前
|
缓存 NoSQL Java
Spring Cache 缓存原理与 Redis 实践
Spring Cache 缓存原理与 Redis 实践
135 0
|
3月前
|
缓存 NoSQL Java
微服务框架(十二)Spring Boot Redis 缓存
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现。 本文为Spring Boot集成Redis。 在这篇文章中,我们将配置一个Spring Boot应用程序示例,并将其与Redis Cache 集成。虽然Redis是一个开源是一个开源内存数据结构存储,用作数据库,缓存和消息代理,但本文仅演示缓存集成。
|
18天前
|
存储 XML 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南(一)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南
40 0
|
2月前
|
缓存 Java 数据库
优化您的Spring应用程序:缓存注解的精要指南
优化您的Spring应用程序:缓存注解的精要指南
37 0
|
28天前
|
缓存 NoSQL Java
spring cache整合redis实现springboot项目中的缓存功能
spring cache整合redis实现springboot项目中的缓存功能
44 1
|
1月前
|
Java 数据库 Spring
如何使用Spring Data JPA完成审计功能
如何使用Spring Data JPA完成审计功能
|
2月前
|
存储 缓存 Java
spring的三级缓存,以及循环依赖的形成和解决(详细)
spring的三级缓存,以及循环依赖的形成和解决(详细)
150 0
|
3月前
|
Java 数据库连接 API
Spring Boot整合Spring Data JPA进行CRUD和模糊查询
Spring Boot整合Spring Data JPA进行CRUD和模糊查询
37 0
|
3月前
|
缓存 Java 测试技术
Spring5源码(19)-Spring从缓存中获取单例bean
Spring5源码(19)-Spring从缓存中获取单例bean
22 0