2012-09-01 10 views
6

Estoy usando Ehcache para almacenar en la memoria caché objetos que son muy caros de cargar en mi aplicación. En la puesta en marcha, guardo en la memoria caché todos los objetos necesarios y se actualizan una vez al día mediante un proceso por separado.Ehcache perder objetos

Sin embargo, parece que poco después de agregar objetos a la memoria caché, desaparecen. No se informa de nada como desalojado, pero los objetos no duran en la memoria caché por alguna razón. Cuando corro ObjectLoader.loadCache() esta es la salida que estoy recibiendo:

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 

qué tengo Ehcache configurado mal o tengo un error en mi código? Cualquier ayuda sería apreciada. Gracias.

estoy usando la primavera 3.1.0, Ehcache-primavera-anotaciones 1.1.2, y 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

Sospecho que desea overflowToDisk = "true". Además, si está utilizando EHCache 2.6 o posterior, en su lugar debería usar . Eche un vistazo a http://ehcache.org/documentation/configuration/fast-restart – GreyBeardedGeek

Respuesta

5

Desde diskPersistent estaba en true Ehcache fue intentar escribir los objetos en el disco después de que se han añadido a la caché. Sin embargo, uno de los objetos anidados dentro del objeto principal en caché no implementó Serializable, por lo que lanzaba una excepción en la escritura del disco y luego desalojaba el objeto del caché. Este desalojo no aparecía en las estadísticas del caché, ya que no fue desalojado por el memoryStoreEvictionPolicy.

Esto debería haber sido un error muy fácil de encontrar, pero el proyecto no incluía la biblioteca slf4j-log4j12, por lo que la excepción se tragó en lugar de escribirse en los registros. Una vez que el registro se manejó correctamente, fue instantáneamente obvio cuál era el problema.

Oh, bueno, vivir y aprender supongo ...