hibernate二级缓存是sessionfactory级别的进程范围缓存,可在多个session间共享,需显式配置缓存提供者(如ehcache)和策略(如read-write),并为实体类声明缓存策略,配合启用statistics才能通过命中/未命中次数验证其真实生效。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在MyEclipse中验证Hibernate二级缓存是否真正生效,不能只看配置文件有没有写对,必须通过运行时SQL输出、内存对象状态和缓存命中日志三重证据交叉确认,否则极易陷入“配置已启用但实际未工作”的假象。
确认二级缓存基础配置已启用
打开项目中的 hibernate.cfg.xml,检查以下三处属性是否同时存在且值为 true:
【hibernate.cache.use_second_level_cache】、【hibernate.cache.use_query_cache】、【hibernate.cache.region.factory_class】(注意:Hibernate 5+ 必须用 region.factory.class,不能再用已废弃的 cache.provider_class)。
若仍使用 cache.provider_class,MyEclipse 启动时会静默忽略二级缓存配置,控制台不会报错但缓存完全不工作。
确保数据库方言与实际版本严格匹配,例如 MySQL 8.0 必须用 org.hibernate.dialect.MySQL8Dialect,写成 MySQLDialect 会导致缓存元数据注册失败。
让缓存行为可视化:强制开启SQL与缓存日志
在 hibernate.cfg.xml 中添加两行关键调试属性:
<property name="show_sql">true</property>
<property name="hibernate.generate_statistics">true</property>
这一步必须做——仅 show_sql 不足以判断缓存是否命中,因为二级缓存命中时 SQL 依然可能被打印(取决于是否开启查询缓存及 HQL 类型);而 generate_statistics 开启后,Hibernate 会在运行时暴露 CacheRegion 和 Statistics API,这是唯一能区分“SQL执行了但数据来自缓存”和“SQL根本没发”的依据。
重启 MyEclipse 并运行测试代码前,务必清空控制台,避免旧日志干扰判断。
编写可验证的缓存命中测试代码
第一步:获取 SessionFactory 实例并启用统计
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
sessionFactory.getStatistics().setStatisticsEnabled(true);
第二步:在同一个 SessionFactory 下创建两个独立 Session,分别查询同一主键实体
Session s1 = sessionFactory.openSession();
Student stu1 = s1.get(Student.class, 1L); // 第一次查,触发 SQL
s1.close();
Session s2 = sessionFactory.openSession();
Student stu2 = s2.get(Student.class, 1L); // 第二次查,应命中二级缓存
Eclipse IDE 是一款由 Eclipse 基金会管理的开源、跨平台集成开发环境。其核心基于 Java 构建,通过强大的插件架构可扩展支持 C/C++、Python、PHP 等多种编程语言。它提供丰富的代码编辑、调试和重构工具,并紧密集成 Git、Maven 等现代开发工具链,是全球众多开发者首选的 Java 开发利器。
s2.close();
第三步:立即打印缓存统计结果
System.out.println("二级缓存命中次数: " + sessionFactory.getStatistics().getSecondLevelCacheHitCount());
System.out.println("二级缓存未命中次数: " + sessionFactory.getStatistics().getSecondLevelCacheMissCount());
如果命中次数为 0,说明缓存未启用或实体未声明缓存策略;如果 miss 次数为 2,说明两次都绕过缓存直连数据库——此时要回头检查 class-cache 或 @Cache 注解是否遗漏。
为实体类显式声明缓存策略
方法一:XML 映射方式(适用于 .hbm.xml 文件)
在 <class></class> 标签内部、<id></id> 标签之前插入:
<cache usage="read-write"></cache>
注意:必须放在
方法二:注解方式(推荐,需确保已启用注解扫描)
在实体类上添加:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
同时确认 pom.xml 或 lib 中包含 hibernate-ehcache 或对应版本的缓存适配器 JAR,缺一则运行时报 ClassNotFoundException: org.hibernate.cache.ehcache.EhCacheRegionFactory。
定位 ehcache.xml 配置失效的典型陷阱
将 ehcache.xml 放入 src 目录后,仍需验证它是否被正确加载:
在 MyEclipse 的 Console 视图中搜索关键词 CacheManager,正常启动应出现类似日志:
net.sf.ehcache.CacheManager - Creating new CacheManager with configuration from classpath:ehcache.xml
若看到 Creating new CacheManager with default config,说明 ehcache.xml 未被读取——常见原因是文件名拼错(如写成 ehcache.xml.bak)、编码非 UTF-8、或被误放在 WebContent/WEB-INF/classes 而非源码根目录。
检查 <diskstore path="..."></diskstore> 路径是否为绝对路径且 MyEclipse 进程有写入权限,路径含中文或空格会导致 EhCache 初始化失败并静默降级为内存缓存。










