Spring Data JPA中如何启用二级缓存?
在Spring Data JPA中启用二级缓存的方法
Spring Data JPA本身只是JPA规范的上层封装,并不自带缓存实现,但它默认依托的Hibernate是JPA规范的实现者,而Hibernate本身支持二级缓存,所以你完全可以像直接使用Hibernate那样配置二级缓存,具体步骤如下:
1. 添加缓存依赖
如果是Spring Boot项目,以常用的Ehcache为例,需要在pom.xml(或build.gradle)中添加以下依赖:
<!-- Spring Boot缓存 starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!-- Hibernate与Ehcache适配依赖 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>你的Hibernate版本</version> </dependency>
2. 配置缓存参数
在application.properties(或application.yml)中添加JPA缓存相关配置:
# 启用Hibernate二级缓存 spring.jpa.properties.hibernate.cache.use_second_level_cache=true # 指定缓存区域工厂(这里用Ehcache的JCache实现) spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory # 可选:启用查询缓存 spring.jpa.properties.hibernate.cache.use_query_cache=true # 可选:显示缓存统计信息,方便调试 spring.jpa.properties.hibernate.generate_statistics=true
3. 标记实体类启用缓存
在需要被缓存的实体类上添加@Cacheable注解(JPA规范注解),如果需要更精细的缓存策略控制,可以搭配Hibernate的@Cache注解指定并发策略:
import javax.persistence.Cacheable; import javax.persistence.Entity; import javax.persistence.Id; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @Entity @Cacheable // JPA规范注解,标记实体可被二级缓存 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // Hibernate注解,指定缓存并发策略 public class User { @Id private Long id; private String username; private String email; // getter、setter方法 }
4. 启用查询缓存(可选)
如果需要缓存自定义查询的结果,除了开启全局查询缓存开关,还要在Repository的查询方法上添加@QueryHints注解标记该查询支持缓存:
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.QueryHints; import org.springframework.data.repository.CrudRepository; import javax.persistence.QueryHint; import java.util.List; public interface UserRepository extends CrudRepository<User, Long> { @QueryHints({@QueryHint(name = "org.hibernate.cacheable", value = "true")}) List<User> findByUsername(String username); }
补充说明
- 二级缓存的作用域是整个EntityManagerFactory,所以同一个项目中不同Repository操作同一实体时,会共享缓存数据;
- 如果你后续切换到其他JPA实现(比如EclipseLink),配置方式会有所不同,但默认用Hibernate的情况下,上述配置完全生效;
- 缓存并发策略需要根据业务场景选择,比如
READ_ONLY适合不会修改的数据,READ_WRITE适合读写频繁的场景,NONSTRICT_READ_WRITE适合对一致性要求不高的场景。
内容的提问来源于stack exchange,提问作者Agrudge Amicus
相关产品推荐
相关产品推荐

