Ehcache установлен на вечный, но все равно забывает элементы?

Я пытаюсь настроить Ehcache (версия 2.5) так, чтобы он никогда не забывал элементы. Я настраиваю программно и не трогал ни один из XML-файлов конфигурации. Установив eternal в true, я понимаю, что единственными обстоятельствами, при которых элемент может быть удален из кеша, будет то, что у меня закончится место на диске или превысит maxBytesLocalDisk (или если приложение завершит работу). Однако эта тестовая программа не показывает такого поведения:

public static void main(String[] args) {
  CacheManager cacheManager = CacheManager.create(); 
  Cache cache = new Cache(
    new CacheConfiguration().name("test")
    .overflowToDisk(true)
    .eternal(true)
    .maxBytesLocalHeap(1, MemoryUnit.MEGABYTES)
    .overflowToOffHeap(false)
    .maxBytesLocalDisk(100, MemoryUnit.GIGABYTES)
    .maxElementsOnDisk(0)
    .timeToIdleSeconds(0)
    .timeToLiveSeconds(0)
    .diskStorePath("E:\\Data\\Ehcache"));
  cacheManager.addCache(cache);
  for(int i = 0; i < 1000000; i++){
    cache.put(new Element("key_" + i, "value_" + i));
  }
  System.out.println(cache.getSize());      
}

Таким образом, после добавления 1 миллиона элементов в мой кеш, который я приказал переполнить на диск, достаточно большой по порядку величины, я получаю только 3276 элементов в конце. Что здесь происходит?


person Michael McGowan    schedule 22.01.2012    source источник


Ответы (1)


При использовании ARC или конфигурации кэша на основе байтов Ehcache попытается защитить вашу систему от OOME. При такой настройке кеша ehcache сообщает, что вы хотите, чтобы этот кеш использовал не более 1 мегабайта кучи. Переполнение на диск сообщает Ehcache о переполнении элементов на диск, когда куча заполняется до порогового значения. Теперь набор ключей для этого кеша останется в куче. И, поскольку Ehcache все еще пытается защитить вас от OOME, его нужно будет удалить с диска, как только набор ключей больше не сможет храниться в памяти.

Я немного изменил вашу конфигурацию, чтобы использовать 10 МБ, я могу получить 32 КБ записей в кеше. Если я изменю ваш ключ на меньший (только экземпляр Integer), я смогу получить 46 КБ записей в кэше. Но в основном эта конфигурация, которую вы используете, является ограничительной, поскольку Ehcache никогда не сможет хранить столько на диске, если ключ установлен в куче. Надеюсь, это немного прояснит ситуацию.

Если у вас действительно есть вариант использования, когда вам нужно разместить много на диске и минимизировать хранилище в куче, вы можете заглянуть в http://ehcache.org/documentation/user-guide/storage-options#enterprise-diskstore

person Alex Snaps    schedule 23.01.2012
comment
На самом деле я не собираюсь использовать только 1 МБ кучи; Я установил его таким образом, чтобы убедиться, что мне нужно переполниться на диск. Я собираюсь использовать несколько ГБ кучи, но я хотел убедиться, что он настроен так, чтобы абсолютно никогда не забывать элементы. - person Michael McGowan; 24.01.2012
comment
Я полагаю, что это отвечает на заданный вопрос, поэтому, пожалуйста, см. мой новый вопрос о том, есть ли способ убедиться, что элементы никогда не удаляйтесь из дискового хранилища (в бесплатной версии). - person Michael McGowan; 24.01.2012