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

如何在Spring Boot3/Hibernate6/JCache/Ehcache3中获取缓存实例?

在Spring Boot 3 + Hibernate 6 + Ehcache 3环境中获取JCache缓存实例的问题

技术栈

  • Spring Boot 3
  • Hibernate 6
  • JCache (Ehcache 3)

背景

原本认为获取缓存实例是企业应用的常规操作,实现起来应该很容易,但实际找不到适配现代Spring Boot应用的有效资料。当前缓存功能正常,已能通过JMX访问统计信息,但需要获取单个缓存实例来手动清除缓存、查看当前条目数量。

pom.xml依赖片段

<dependency>
    <groupId>org.hibernate.orm</groupId>
    <artifactId>hibernate-jcache</artifactId>
</dependency>
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <classifier>jakarta</classifier>
</dependency>

ehcache.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.ehcache.org/v3"
        xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
        xsi:schemaLocation="http://www.ehcache.org/v3
                            http://www.ehcache.org/schema/ehcache-core.xsd">

    <cache-template name="status-cache">
        <expiry><ttl>3600</ttl></expiry>
        <resources>
            <heap>10</heap>
            <offheap unit="MB">1</offheap>
        </resources>
    </cache-template>
    
    <cache alias="email-status-cache" uses-template="status-cache"/>
</config>

application.yml配置

spring.jpa.properties:
  -hibernate.cache.region.factory_class: "org.hibernate.cache.jcache.internal.JCacheRegionFactory"
  -hibernate.cache.use_second_level_cache: true
  -hibernate.javax.cache.provider: "org.ehcache.jsr107.EhcacheCachingProvider"
  -hibernate.javax.missing_cache_strategy: fail
  -hibernate.javax.cache.uri: "classpath:ehcache.xml"
  -hibernate.generate_statistics: true
  -jakarta.persistence.sharedCache.mode: ENABLE_SELECTIVE

可缓存实体类EmailStatus

@Entity
@Immutable
@Access(AccessType.FIELD)
@org.hibernate.annotations.Cache(region = "email-status-cache",
                                 usage = CacheConcurrencyStrategy.READ_ONLY)
@Table(name = "email_status")
public class EmailStatus implements Serializable {

    //...
}

当前可用的JMX统计代码

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

try {
    Set<ObjectInstance> cacheBeans = mBeanServer.queryMBeans(ObjectName.getInstance("javax.cache:type=CacheStatistics,CacheManager=*,Cache=*"), null);

    for (ObjectInstance cacheBean : cacheBeans) {
        CacheStatisticsMXBean cacheStatisticsMXBean = JMX.newMBeanProxy(mBeanServer, cacheBean.getObjectName(), CacheStatisticsMXBean.class);
        logger.info(cacheStatisticsMXBean.getCacheHits());
    }
} catch (MalformedObjectNameException e) { }

失败的尝试

  1. 注入Spring CacheManager

    Cache cache = cacheManager.getCache("email-status-cache");
    

    返回null,此方法无效。

  2. 注入JCacheCacheManager

    Cache cache = jCacheCacheManager.getCache("email-status-cache");
    

    同样返回null。

  3. 直接通过Ehcache StatisticsService访问

    StatisticsService service = new DefaultStatisticsService();
    org.ehcache.CacheManager cm = CacheManagerBuilder.newCacheManagerBuilder().using(service).build();
    cm.init();
    
    CacheStatistics stats = service.getCacheStatistics("email-status-cache");
    long heapCount = stats.getTierStatistics().get("Onheap").getMappings();
    

    抛出IllegalArgumentException: Unknown cache: email-status-cache异常,使用全限定名称替代缓存别名也无济于事。

问题

如何在Spring Boot 3中,通过JCache facade获取适配Hibernate 6的Ehcache 3缓存实例?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:03:25