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

Infinispan JCache如何获取缓存条目数量?(Wildfly+Maven环境)

获取Infinispan JCA包装缓存的条目数量

首先,你遇到的情况很常见——WildFly中通过JCA适配器获取到的Infinispan缓存实例确实是org.infinispan.jca...包下的包装类(比如RemoteCacheWrapper或LocalCacheWrapper),这些类是JCA规范要求的适配层,用来整合Infinispan和应用服务器的资源管理。

要获取缓存条目数量,有两种可靠的方式:


方式1:通过JCache标准API获取(推荐)

既然你已经在使用JCache注解(@CacheResult等),优先用标准JCache API操作缓存更稳妥,还能避免依赖Infinispan的实现细节。你可以直接通过CacheManager获取规范的javax.cache.Cache实例,然后调用size()方法:

import javax.cache.Cache;
import javax.cache.CacheManager;
import javax.cache.Caching;

// 获取全局CacheManager
CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();
// 替换成你的缓存名称,要和@CacheResult等注解中指定的名称一致
Cache<String, Object> yourCache = cacheManager.getCache("your-cache-name");

// 获取条目数量
long entryCount = yourCache.size();

这种方式完全符合JCache规范,就算未来更换缓存实现(比如换成EHCache),代码也不需要修改。


方式2:转换为Infinispan原生缓存

如果你需要使用Infinispan的特定功能(比如更细粒度的缓存控制),可以把JCA包装类转换为Infinispan原生的Cache接口:

import org.infinispan.Cache;
import org.infinispan.jca.CacheWrapper;

// 假设你已经拿到了JCA包装的缓存实例cacheWrapper
CacheWrapper cacheWrapper = ...; // 你的缓存实例
Cache<?, ?> infinispanCache = cacheWrapper.getCache();

// 获取条目数量
long entryCount = infinispanCache.size();

或者,如果包装类实现了javax.cache.Cache的unwrap方法,也可以这样做:

import javax.cache.Cache;

// 假设cacheInstance是你拿到的org.infinispan.jca...类型的实例
Cache<K, V> jcache = cacheInstance.unwrap(Cache.class);
long entryCount = jcache.size();

注意事项

  • 如果你使用的是远程缓存(Hot Rod),调用size()方法会触发一次远程请求,大缓存场景下可能有性能开销,需要结合业务场景评估。
  • 确保获取缓存时用的名称和注解中配置的完全一致(比如@CacheResult(cacheName = "user-cache"),就要用"user-cache"来获取)。

内容的提问来源于stack exchange,提问作者Juan Pablo Perata

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:33:03