Ehcache установлен на вечность, но все равно забывает элементы? - PullRequest
7 голосов
/ 22 января 2012

Я пытаюсь настроить 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 элементов в конце. Что здесь происходит?

1 Ответ

6 голосов
/ 23 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...