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
相关产品推荐
相关产品推荐

