Неверная статистика ehcache: попаданий+промахов == 0

У меня возникла проблема, когда net.sf.ehcache.CacheManager возвращает неверную статистику.

Я использую ehcache-core v2.3.2 (последняя версия) с ehcache-spring-annotations.

Проблема заключается в том, что getMemoryStoreObjectCount возвращает объект 1, а getCacheHits и getCacheMisses возвращают 0. Разве общее количество не должно быть hits + misses?

Приведенный ниже модульный тест должен проиллюстрировать проблему (он применяется к пустой базе данных):

@Test
public void testCache() {
    Entity e = ..
    dao.storeEntity(e);
    dao.getEntity(e);
    assertEquals(1, cache.getStatistics().getMemoryStoreObjectCount()); // ok
    assertEquals(0, cache.getStatistics().getCacheHits()); // ok
    assertEquals(1, cache.getStatistics().getCacheMisses()); // fails due to 0

}

Для полноты я включаю все необходимые настройки:

Весенняя конфигурация

<ehcache:annotation-driven cache-manager="ehCacheManager" />
<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache.xml"/>
</bean>

ehcache.xml

<ehcache>
     <defaultCache eternal="false" maxElementsInMemory="1000"
        overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
        timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>
</ehcache>

дао

@Cacheable(keyGenerator=@KeyGenerator(name="StringCacheKeyGenerator"))
public Entity getEntity(Serializable key) {
    return // sql ... 
}

person Johan Sjöberg    schedule 10.03.2011    source источник
comment
Привет, не могли бы вы опубликовать свой код о том, как вы получили переменную кеша в своем тесте JUnit из конфигурации Spring?   -  person Dave    schedule 19.02.2016


Ответы (3)


Добавьте statistics="true" в файл ehcache.xml. Обычно лучше оставить изменения конфигурации вне кода.

<ehcache>
     <defaultCache ... statistics="true" />
...
</ehcache>
person aaronvargas    schedule 15.07.2011

Нашел решение проблемы, задав следующие свойства в net.sf.ehcache.hibernate.EhCache:

  cache.setStatisticsEnabled(true);
  cache.setStatisticsAccuracy(Statistics.STATISTICS_ACCURACY_GUARANTEED);
person Johan Sjöberg    schedule 10.03.2011
comment
хотя, возможно, 2-й не требуется. - person Bozho; 23.03.2011
comment
@Божо, наверное, нет, но в тесте это не будет иметь значения. - person Johan Sjöberg; 23.03.2011
comment
да. Я просто подумал, что это стоит упомянуть. Во всяком случае, ответ сформировался для меня, поэтому +1. - person Bozho; 23.03.2011

<defaultCache ... statistics="true" /> сильно отличается от старого cache.setStatisticsEnabled(true); для этого требуется более низкая версия ehcache (ядро и т. д.).

person Ross Bu    schedule 10.01.2012