Spring Boot3+Hibernate6+Ehcache3缓存创建日志异常及重复创建疑问
问题解答
1. 是否生成了两个缓存?
没有。两条日志记录的是同一个缓存的创建流程:
- Hibernate先检测到名为
com.archilleuswebservice.model.organizationalStructure.Company的缓存不存在,触发动态创建逻辑(输出WARN日志); - 接着Ehcache执行实际的缓存创建操作,输出INFO日志确认缓存创建完成。
二者是同一缓存的不同阶段日志,不存在重复创建的情况。
2. 为什么会出现这个警告?
核心原因是缓存名称不匹配:
- Hibernate默认使用实体类的全限定类名(
com.archilleuswebservice.model.organizationalStructure.Company)作为二级缓存的名称; - 但你在
ehcache.xml中配置的缓存别名是Company,和Hibernate期望的名称不一致,导致Hibernate找不到预先定义的缓存配置,只能使用默认配置动态创建缓存。
3. 该情况是否有问题?
短期不会导致功能异常,但存在两个隐患:
- 你在
ehcache.xml中为Company定义的自定义配置(比如堆内存上限100条)没有生效,动态创建的缓存会使用Ehcache的默认模板配置(堆内存10000条); - 频繁的动态创建缓存会增加应用启动时的开销,且可能出现配置不一致的问题。
4. 解决办法
有三种方案可选,按需选择:
方案一:修改ehcache.xml的缓存别名
将Company缓存的alias改为实体的全限定类名:
<cache alias="com.archilleuswebservice.model.organizationalStructure.Company"> <key-type>java.lang.Object</key-type> <value-type>com.archilleuswebservice.model.organizationalStructure.Company</value-type> <expiry> <ttl unit="seconds">86400</ttl> </expiry> <resources> <heap unit="entries">100</heap> </resources> </cache>
方案二:通过@Cache注解指定缓存区域
在Company实体类的@Cache注解中,添加region属性指定ehcache.xml中定义的别名:
@Entity @Table(name="company") @Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "Company") public class Company implements Serializable{ // ... 实体代码 }
方案三:配置Hibernate使用短类名作为缓存名称
在hibernate.properties中添加配置,让Hibernate使用实体的短类名作为缓存名称:
hibernate.cache.use_short_names=true
内容的提问来源于stack exchange,提问作者Djordje Ivanovic
相关产品推荐
相关产品推荐

