2012-09-01 11 views
6

Ich benutze Ehcache zum Zwischenspeichern von Objekten, die sehr teuer in meiner Anwendung geladen werden. Beim Start zwischenspeichern ich alle benötigten Objekte und sie werden einmal am Tag von einem separaten Prozess aktualisiert.Ehcache verlieren Objekte

Es scheint jedoch, dass kurz nachdem ich Objekte zum Cache hinzufügen, sie verschwinden. Nichts wird als geräumt gemeldet, aber die Objekte bleiben aus irgendeinem Grund nicht im Cache. Wenn ich ObjectLoader.loadCache laufen() ist dies die Ausgabe ich empfangen habe:

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 

habe ich ehcache falsch konfiguriert oder habe ich einen Fehler in meinem Code? Jede Hilfe wäre willkommen. Vielen Dank.

Ich bin mit Feder 3.1.0, ehcache-Feder-Anmerkungen 1.1.2 und 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

Ich vermute, dass Sie overflowToDisk = "true" wollen. Wenn Sie EHCache 2.6 oder höher verwenden, sollten Sie stattdessen verwenden. Werfen Sie einen Blick auf http://ehcache.org/documentation/configuration/fast-restart – GreyBeardedGeek

Antwort

5

Seit diskPersistent zu gesetzt wurde wahr Ehcache wurde versucht, die Objekte auf die Festplatte zu schreiben, nachdem sie in dem Cache hinzugefügt wurden. Eines der verschachtelten Objekte im Hauptobjekt im Cache implementierte Serializable jedoch nicht, sodass beim Schreiben von Daten eine Ausnahme ausgelöst wurde und das Objekt aus dem Cache entfernt wurde. Diese Räumung wurde in der Cache-Statistik nicht angezeigt, da sie nicht durch die memoryStoreEvictionPolicy geräumt wurde.

Dies sollte ein sehr einfacher Fehler zu finden gewesen sein, aber das Projekt enthielt nicht die slf4j-log4j12 Bibliothek, so dass die Ausnahme geschluckt wurde anstatt in die Protokolle geschrieben zu werden. Sobald die Protokollierung ordnungsgemäß durchgeführt wurde, war sofort klar, was das Problem war.

Na ja, leben und lernen Ich denke, ...