如何在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) { }
失败的尝试
注入Spring CacheManager
Cache cache = cacheManager.getCache("email-status-cache");返回
null,此方法无效。注入JCacheCacheManager
Cache cache = jCacheCacheManager.getCache("email-status-cache");同样返回
null。直接通过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
相关产品推荐
相关产品推荐

