2012-01-22 4 views
7

Ehcache (버전 2.5)가 항목을 잊어 버리지 않도록 구성하려고합니다. 프로그래밍 방식으로 구성 중이며 구성 XML 파일 중 하나도 다루지 않았습니다. eternaltrue으로 설정하면 디스크 공간이 부족하거나 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는이 캐시가 최대 1MB의 힙을 사용하도록합니다. 디스크로 오버플로하면 힙이 임계 값으로 가득 차면 Ehcache가 디스크로 요소를 오버플로합니다. 이제이 캐시에 설정된 키는 여전히 힙에 남아 있습니다. 그리고 Ehcache가 여전히 OOME에서 당신을 보호하려고 시도 할 때, 키 집합이 더 이상 메모리에 저장 될 수 없게되면 디스크에서 제거해야합니다.

구성을 10MB로 약간 변경했는데 캐시에 32K 개의 항목이 있습니다. 키를 작게 (Integer 인스턴스 만) 변경하면, 캐시에 46K 항목을 가져올 수 있습니다. 그러나 기본적으로 Ehcache는 힙을 키로 설정하여 디스크에 그다지 많은 양을 저장할 수 없으므로이 구성은 제한적입니다. 희망이 조금 명확히. 당신이 정말로 당신이 디스크에 많이 넣고에 힙 저장 공간을 최소화해야하는 사용 사례가있는 경우

, 당신은 실제로 힙의 1메가바이트를 사용하지 않을 http://ehcache.org/documentation/user-guide/storage-options#enterprise-diskstore

+0

을 조사 할 수 있습니다; 나는 디스크에 넘칠 필요가 생길 때까지 그렇게 할 수 있도록 설정했습니다. 몇 GB의 힙을 사용할 예정이지만 요소를 절대 잊지 않도록 구성했는지 확인하고 싶습니다. –

+0

이 질문에 답을 얻은 것 같아요. [내 새로운 질문을보십시오] (http://stackoverflow.com/q/8980467/387852) 엘리먼트 **가 절대로 ** 얻을 수 없는지 확인하십시오. 디스크 스토어에서 퇴출되었습니다 (무료 버전). –

관련 문제