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
相关产品推荐
相关产品推荐

