2012-01-22 14 views
7

Próbuję skonfigurować Ehcache (wersja 2.5), tak aby nigdy nie zapomniał elementów. Konfiguruję programowo i nie dotknąłem żadnych plików XML konfiguracji. Ustawiając eternal na true, rozumiem, że jedyne okoliczności, w których element mógłby zostać usunięty z pamięci podręcznej, byłyby, gdyby zabrakło miejsca na dysku lub przekroczyłem maxBytesLocalDisk (lub jeśli aplikacja zostanie zakończona). Jednak program ten test nie pokazać, że zachowanie:Ehcache ustawiony na wieczny, ale zapomina o elementach?

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());  
} 

Więc po dodaniu 1 mln elementów do mojej pamięci podręcznej, co powiedziałem do przepełnienia na dysku, który jest na tyle duża, o rzędy wielkości, tylko skończyć z 3276 pozycji na końcu. Co tu się dzieje?

Odpowiedz

6

Podczas korzystania z ARC lub konfiguracji pamięci podręcznej opartej na bajtach, Ehcache spróbuje chronić system OOME. Konfigurując pamięć podręczną tak, jak to robiłeś, mówi ehcache, że chcesz, aby ta pamięć podręczna używała co najwyżej 1 megabajt sterty. Przepełnienie na dysku mówi Ehcache, aby przepełniał elementy na dysku, gdy sterty są wypełnione do progu. Teraz zestaw kluczy dla tej pamięci podręcznej pozostanie na kupie. A ponieważ Ehcache nadal próbuje chronić Cię przed OOME, będzie musiał wyrzucić z dysku, jak tylko zestaw kluczy nie będzie już w pamięci.

Ja nieznacznie zmieniłem twoją konfigurację, by użyć 10 MB, mogę dostać 32K wpisów w Cache. Jeśli zmienię Twój klucz na mniejszy (tylko instancja Integer), mogę uzyskać 46K wpisów w pamięci podręcznej. Zasadniczo ta konfiguracja, której używasz, jest restrykcyjna, ponieważ Ehcache nigdy nie będzie w stanie utrzymać tak dużej ilości na dysku, z kluczem ustawionym na stercie. Mam nadzieję, że to trochę wyjaśnia.

Jeśli naprawdę masz przypadek użycia, gdzie trzeba włożyć wiele na dysku i zminimalizować składowanie on-sterty, warto zajrzeć do http://ehcache.org/documentation/user-guide/storage-options#enterprise-diskstore

+0

ja właściwie nie zamierzają używać tylko 1MB sterty; Ustawiłem to tak, aby upewnić się, że dojdę do punktu, w którym trzeba przepełnić dysk. Zamierzam użyć kilku gigabajtów sterty, ale chciałem się upewnić, że mam to skonfigurowane tak, aby absolutnie nigdy nie zapominać o elementach. –

+0

Przypuszczam, że to odpowiada na pytanie zadane, więc proszę [zobacz moje nowe pytanie] (http://stackoverflow.com/q/8980467/387852), czy istnieje jakiś sposób, aby upewnić się, że elementy ** nigdy ** nie otrzymają eksmitowane z magazynu dyskowego (w wersji darmowej). –

Powiązane problemy