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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:19:52