JCache CacheStatisticis с размером кэша - PullRequest
0 голосов
/ 23 мая 2019

Я использовал JCache с EhCache в качестве провайдера. Используя 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 голосов
/ 05 июня 2019

К сожалению, стандарт JSR107 не определяет размер в объекте статистики. См .: CacheStatisticsMXBean

Некоторые причины, которые я вспоминаю из обсуждений с группой экспертов и специалистами по спецификациям, а также из моего собственного опыта реализации кеша:

  • Для распределенного кэша трудно определить размер. Может потребоваться вызвать другие узлы, и значение может быть как-то только оценочным
  • Стандарт JSR107 опущен, чтобы указать ограничение размера. Это связано с тем, что некоторые реализации указывают количество записей, некоторые используют байты. Так что, вероятно, «идея о размере» была упущена, следовательно, и в статистике
  • Если срок действия определен, размер кэша может означать разные вещи: количество записей, которые еще не истекли, количество записей, занимающих память в кэше. Наиболее логичной мерой будут «записи не истекли». Но это может привести к тому, что некоторые реализации кеша проверят записи с истекшим сроком до того, как статистика может быть возвращена

Хотя очень больно, что в статистике отсутствует размер, есть причины не включать его. Метрики, которые доступны сейчас, это просто считывание со счетчиков. В зависимости от реализации для определения размера требуются более сложные операции.

...