You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:53:30