具有缓存大小的JCache CacheStatisticis

时间:2019-05-23 20:34:36

标签: spring jcache

我使用了带有EhCache的JCache作为提供程序。使用MBean,我可以获取缓存统计信息,但是缺少诸如缓存大小之类的属性。我看到LiveCacheStatistics提供了它,但是如何从JCache获取它的实例

List<Map<String,Object>> cacheStatasticsList = new ArrayList<>();

try {
    final MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();

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

    for (ObjectInstance cacheBean : cacheBeans) {
        final CacheStatisticsMXBean cacheStatisticsMXBean =
                MBeanServerInvocationHandler.newProxyInstance(beanServer, cacheBean.getObjectName(), CacheStatisticsMXBean.class, false);

        Map<String,Object> cacheStatasticsMap = new HashMap<>();
        cacheStatasticsMap.put("Name",cacheBean.getObjectName().getKeyProperty("Cache"));                
        cacheStatasticsMap.put("Gets",cacheStatisticsMXBean.getCacheGets());
        cacheStatasticsMap.put("Hits",cacheStatisticsMXBean.getCacheHits());
        cacheStatasticsMap.put("Misses",cacheStatisticsMXBean.getCacheMisses());
        cacheStatasticsMap.put("Removals",cacheStatisticsMXBean.getCacheRemovals());
        cacheStatasticsMap.put("Evictions", cacheStatisticsMXBean.getCacheEvictions());
        cacheStatasticsMap.put("AvgGetTime", cacheStatisticsMXBean.getAverageGetTime());
        cacheStatasticsMap.put("AvgPutTime", cacheStatisticsMXBean.getAveragePutTime());
        cacheStatasticsMap.put("AvgRemoveTime" , cacheStatisticsMXBean.getAverageRemoveTime());
        cacheStatasticsList.add(cacheStatasticsMap);
    }

} catch(Exception e){
    log.error("Error in getting cache statistics.");
    return cacheStatasticsList;
}
return cacheStatasticsList;

1 个答案:

答案 0 :(得分:0)

不幸的是,JSR107标准未在统计对象中定义大小。参见:CacheStatisticsMXBean

我从与专家组和规格负责人的讨论以及作为缓存实现者的经验中回想起的一些原因:

  • 对于分布式缓存,很难确定大小。可能需要调用其他节点,并且该值可能以某种方式仅是估计值
  • 省略了JSR107标准以指定大小限制。这是因为某些实现指定条目的计数,而某些实现则使用字节。因此,统计数据中也可能因此忽略了“规模的想法”
  • 如果定义了到期时间,则缓存大小可能意味着不同的含义:尚未到期的条目数,占用缓存中内存的条目数。最合乎逻辑的措施是“条目未过期”。但这会使某些缓存实现在返回统计信息之前检查过期条目

尽管非常痛苦,但是统计数据中缺少大小,但是有理由不包括它。现在可用的度量标准只是从计数器中读出的。根据实现的不同,需要一些更重的操作。

相关问题