2012-01-22 2 views
7

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

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

ответ

6

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

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

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

+0

Я на самом деле не намерены использовать только 1 Мбайт кучи; Я установил его таким образом, чтобы убедиться, что я доберусь до переполнения на диск. Я собираюсь использовать несколько Гбайт кучи, но я хотел убедиться, что у меня настроено абсолютно не забывать элементы. –

+0

Я полагаю, что это отвечает на вопрос, как было задано, поэтому, пожалуйста, [см. Мой новый вопрос] (http://stackoverflow.com/q/8980467/387852), существует ли какой-либо способ убедиться, что элементы ** никогда не получают выселен из дискового магазина (в бесплатной версии). –

Смежные вопросы