2016-12-09 1 views
1

ehcache에서 지속성 문제가 있습니다. 처음 시작할 때 캐시 자체가 잘 작동하지만 tomcat 서블릿을 다시 시작할 때 이전 값을 기억하지 못합니다. 여기에 ehcache를 초기화하는 코드가 있습니다. 나는 XML을 사용하지 않고있다.EhCache 3.1.3 지속성 문제

import org.ehcache.Cache; 
import org.ehcache.PersistentCacheManager; 
import org.ehcache.Status; 
import org.ehcache.config.builders.CacheConfigurationBuilder; 
import org.ehcache.config.builders.CacheManagerBuilder; 
import org.ehcache.config.builders.ResourcePoolsBuilder; 
import org.ehcache.config.units.EntryUnit; 
import org.ehcache.config.units.MemoryUnit; 

PersistentCacheManager persistentCacheManager = 
    CacheManagerBuilder.newCacheManagerBuilder() 
      .with(CacheManagerBuilder.persistence("/cache")) 
      .withCache("test-cache", 
        CacheConfigurationBuilder.newCacheConfigurationBuilder(
          Integer.class, String.class, 
          ResourcePoolsBuilder.newResourcePoolsBuilder() 
            .heap(1, EntryUnit.ENTRIES) 
            .offheap(1, MemoryUnit.MB) 
            .disk(20, MemoryUnit.MB) 
        ) 
      ).build(true); 
Cache cache = persistentCacheManager.getCache("test-cache", Integer.class, String.class); 

log.info("Cache get 1 before putting: " + cache.get(1)); 
for(int i = 0; i< 1000; i++) { 
    cache.put(i,"Hello"); 
} 
log.info("Cache get 1 after putting: " + cache.get(1)); 

"before"로그 문의 결과는 다시 시작한 후에 항상 null입니다.

+0

은 아마도 내가 완전히 "지속성"이 상황에서 무엇을 의미하는지 이해가 안가? 나는 캐시가 디스크에 저장되도록 유지하여 서버를 다시 시작할 때 다시로드 할 수 있다고 생각했습니다. – atopcu

+0

문서는 당신이 맞을 것이라고 제안하지만, 나는 당신이 무엇을 놓쳤는 지 전혀 모른다. 참으십시오. –

답변

2

디스크 자원 소스 풀을 지속적으로 선언해야합니다. 기본적으로 아닙니다.

.disk(20, MemoryUnit.MB, true) 

그러면 테스트가 완벽하게 작동합니다.

캐시 관리자 폐쇄를 포함한 전체 코드 :

import org.ehcache.Cache; 
import org.ehcache.PersistentCacheManager; 
import org.ehcache.config.units.EntryUnit; 
import org.ehcache.config.units.MemoryUnit; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import static org.ehcache.config.builders.CacheConfigurationBuilder.*; 
import static org.ehcache.config.builders.CacheManagerBuilder.*; 
import static org.ehcache.config.builders.ResourcePoolsBuilder.*; 

public class Main { 

    private static final Logger log = LoggerFactory.getLogger(Main.class); 

    public static void main(String[] args) { 
    try(PersistentCacheManager persistentCacheManager = 
     newCacheManagerBuilder() 
      .with(persistence("cache")) 
      .withCache("test-cache", 
       newCacheConfigurationBuilder(
        Integer.class, String.class, 
        newResourcePoolsBuilder() 
         .heap(1, EntryUnit.ENTRIES) 
         .offheap(1, MemoryUnit.MB) 
         .disk(20, MemoryUnit.MB, true) 
       ) 
      ).build(true)) { 
     Cache cache = persistentCacheManager.getCache("test-cache", Integer.class, String.class); 

     log.info("Cache get 1 before putting: " + cache.get(1)); 
     for (int i = 0; i < 1000; i++) { 
     cache.put(i, "Hello"); 
     } 
     log.info("Cache get 1 after putting: " + cache.get(1)); 
    } 
    } 
} 
+1

또한 'CacheManager'는 적절히 close()되어야합니다 –

+0

당신 말이 맞습니다. 나는 나의 예에서 근육 기억을 통해 않았다 :-) 내 대답을 편집하게 해줘. – Henri