2012-09-01 19 views
6

Używam Ehcache do buforowania obiektów, które są bardzo drogie do załadowania w mojej aplikacji. Podczas uruchamiania buforuję wszystkie potrzebne obiekty i odświeżam je raz dziennie w oddzielnym procesie.Ehcache utrata obiektów

Wygląda jednak na to, że wkrótce po dodaniu obiektów do pamięci podręcznej znikają. Nic nie jest zgłaszane jako eksmitowane, ale przedmioty nie pozostają w pamięci podręcznej z jakiegoś powodu. Kiedy uruchamiam ObjectLoader.loadCache() jest to wyjście Otrzymuję:

2012-09-01 17:25:37,121 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:25:37,121 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 0 
2012-09-01 17:25:37,121 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 501 
2012-09-01 17:26:17,271 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:26:17,271 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 501 
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 1 
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 518 
2012-09-01 17:26:35,894 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 518 
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 1 
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 516 
2012-09-01 17:27:31,997 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 516 
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 1 
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 515 
2012-09-01 17:28:20,343 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:28:20,343 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 515 
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 1 
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 525 
2012-09-01 17:29:05,616 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 525 
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 1 
2012-09-01 17:29:05,618 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 512 
2012-09-01 17:29:38,790 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:29:38,790 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:29:38,790 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 512 

Czy mam ehcache skonfigurowany niewłaściwy lub mam błąd w moim kodu? Każda pomoc będzie doceniona. Dzięki.

Używam sprężynę 3.1.0, ehcache-resor adnotacje 1.1.2 i ehcache 2.4.2

ObjectCacheFacade.java

@Component() 
public class ObjectCacheFacade { 
    private static final String CACHE_KEY = "myObjectCache"; 

    @Resource 
    private CacheManager cacheManager; 
    private Cache cache; 

    public ObjectCacheFacade() { 
     cacheManager = CacheManager.getInstance(); 
     this.cache = cacheManager.getCache(CACHE_KEY); 
    } 

    public Object getObjectFromCache(String objectId) { 
     Object result = null; 
     Element element = cache.get(objectId); 

     if (element != null && element.getValue() != null) { 
      result = element.getObjectValue(); 
     } 

     return result; 
    } 

    public void putObjectIntoCache(String objectId, Object object) { 
     Element element = new Element(objectId, object); 
     cache.put(element); 
    } 

    public int getSize() { 
     return cache.getSize(); 
    } 

    public void removeObjectFromCache(String objectId) { 
     cache.remove(objectId); 
    } 

    public void flushCache() { 
     cache.removeAll(); 
    } 

    public Cache getCache() { 
     return cache; 
    } 
} 

ObjectLoader.java

@Service 
public class ObjectLoader { 
    private static final Logger log = Logger.getLogger(ObjectLoader.class); 

    @Resource 
    protected ObjectDao objectDao; 
    @Resource 
    protected ObjectCacheFacade objectCache; 

    public void loadCache() { 
     List<String> objectIds = objectDao.getObjectIds(); 

     for (String objectId : objectIds) { 
      loadObject(objectId); 
     } 
    } 

    public Object getObject(String objectId) { 
     log.debug("************************************"); 
     log.debug("Number of objects in cache: " + objectCache.getSize()); 

     Object object = objectCache.getObjectFromCache(objectId); 

     if (object == null) { 
      log.debug("Object not in cache | " + objectId); 
      object = objectDao.getObject(objectId); 

      if (object != null) { 
       objectCache.putObjectIntoCache(objectId, object); 

       log.debug("Number of objects in cache: " + objectCache.getSize()); 
       log.debug("Number of objects evicted from cache: " + objectCache.getCache().getCacheEventNotificationService().getElementsEvictedCounter()); 
       for (Object key : objectCache.getCache().getKeys()) { 
        log.debug("Object key found: " + key); 
       } 
      } 
     } 

     return object; 
    } 
} 

ehcache.xml

<ehcache> 
    <diskStore path="java.io.tmpdir"/> 

    <defaultCache 
     maxElementsInMemory="1000" 
     eternal="false" 
     timeToIdleSeconds="60" 
     timeToLiveSeconds="300" 
     overflowToDisk="false" 
     memoryStoreEvictionPolicy="LRU" 
     /> 

    <cache 
     name="myObjectCache" 
     maxElementsInMemory="1000" 
     eternal="true" 
     timeToIdleSeconds="0" 
     timeToLiveSeconds="0" 
     overflowToDisk="false" 
     diskPersistent="true" 
     memoryStoreEvictionPolicy="LRU" 
     /> 

</ehcache> 

applicationContext.xml

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" /> 
+0

Podejrzewam, że chcesz overflowToDisk = "true". Ponadto, jeśli używasz EHCache 2.6 lub nowszego, powinieneś zamiast tego używać . Zobacz http://ehcache.org/documentation/configuration/fast-restart – GreyBeardedGeek

Odpowiedz

5

Od diskPersistent została ustawiona na wartość true Ehcache usiłował napisać obiekty na dysku po jakiej zostały dodane do pamięci podręcznej. Jednak jeden z zagnieżdżonych obiektów wewnątrz głównego buforowanego obiektu nie zaimplementował Serializable, więc rzucił wyjątek na zapis dysku, a następnie wyrzucał obiekt z pamięci podręcznej. Ta eksmisja nie pojawiła się w statystykach pamięci podręcznej, ponieważ nie została wyeksmitowana przez memoryStoreEvictionPolicy.

To powinien być bardzo łatwy błąd do znalezienia, ale projekt nie zawierał biblioteki slf4j-log4j12, więc wyjątek został połknięty zamiast zapisywania go w dziennikach. Po prawidłowym postępowaniu z logowaniem natychmiast było jasne, na czym polega problem.

Och dobrze, żyć i uczyć się chyba ...