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

Hibernate应用二级缓存失效问题求助

Hibernate二级缓存未生效的排查思路

1. 确认实体类已启用二级缓存

Hibernate不会默认对实体开启二级缓存,必须显式配置。在TestEntity类上添加缓存注解:

@Entity
@Cacheable // 标记实体可被二级缓存
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // 根据业务场景选择策略,如READ_ONLY、NONSTRICT_READ_WRITE等
public class TestEntity {
    @Id
    private Integer id;
    // 字段、getter/setter方法...
}

若使用XML映射,需在实体的hbm文件中添加<cache>节点配置。

2. 修复事务边界问题

Hibernate的二级缓存写入依赖事务提交,未提交的事务不会将实体同步到二级缓存。修改测试代码,确保第一个Session的操作在事务中完成:

try (Session session = HibernateSessionFactory.getSessionFactory().openSession()) {
    session.beginTransaction(); // 开启事务
    session.setCacheMode(CacheMode.PUT);
    test1 = session.find(TestEntity.class, 1);
    session.getTransaction().commit(); // 提交事务触发缓存写入
}

3. 验证Hibernate配置的完整性

  • 将过时的hibernate.cache.use_second_level_cache替换为Hibernate 6.x推荐的hibernate.cache.enabled,保持值为true
  • 添加JCache提供方配置,明确指定Ehcache实现:
    <property name="hibernate.javax.cache.provider" value="org.ehcache.jsr107.EhcacheCachingProvider"/>
    
  • 若需自定义缓存规则,确保ehcache.xml配置文件存在于类路径下,Hibernate会自动加载该文件。

4. 检查版本兼容性

你使用的Hibernate 6.2.0.CR2是候选发布版,存在稳定性风险,建议替换为稳定版(如6.2.20.Final);同时确保Ehcache版本与Hibernate兼容,Hibernate 6.x推荐使用Ehcache 3.10+版本。

5. 开启缓存日志排查

添加日志配置,输出Hibernate缓存操作细节,确认缓存读写行为:

# 以SLF4J为例,配置DEBUG级别日志
logging.level.org.hibernate.cache=DEBUG

查看日志中是否包含Cache put、Cache hit、Cache miss等关键字,以此判断缓存是否正常工作。

6. 修正对象引用的断言误区

即使二级缓存生效,test1 == test2也会返回false——二级缓存存储的是实体数据,第二个Session会从缓存加载数据并创建新的对象实例。应将断言改为验证对象内容相等:

assertThat(test1.equals(test2)).isTrue();

内容的提问来源于stack exchange,提问作者Ramazan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:45:05