2012-01-22 19 views
7

Estoy intentando configurar Ehcache (versión 2.5) para que nunca se olvide de los elementos. Me estoy configurando programáticamente y no he tocado ninguno de los archivos XML de configuración. Al establecer eternal en true entiendo que las únicas circunstancias bajo las cuales un elemento podría eliminarse de la memoria caché serían si me quedo sin espacio en el disco o si excedí maxBytesLocalDisk (o si la aplicación finaliza). Sin embargo, este programa de prueba no muestra que el comportamiento:Ehcache establecido en eterno pero olvida elementos de todos modos?

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());  
} 

Así que después de la adición de 1 millón de elementos a mi caché, lo que le dije a desbordarse en un disco que es lo suficientemente grande como en órdenes de magnitud, que sólo terminan con 3276 artículos al final. ¿Que está sucediendo aquí?

Respuesta

6

Al usar ARC, o la configuración de caché basada en bytes, Ehcache intentará proteger su sistema de un OOME. Al configurar el caché como lo hizo, le dice a ehcache que desea que este caché use como máximo 1 megabyte de heap. El desbordamiento en el disco le dice a Ehcache que desborde los elementos al disco cuando el montón se llena hasta el umbral. Ahora, la clave establecida para este caché aún permanecerá en el montón. Y, como Ehcache todavía intenta protegerte de OOME, tendrá que desalojarlo del disco, tan pronto como la clave establecida ya no pueda guardarse en la memoria.

Cambié ligeramente su configuración para usar 10MB, puedo obtener 32K entradas en la memoria caché. Si cambio tu clave para que sea más pequeña (solo la instancia de Entero), puedo obtener 46K entradas en la memoria caché. Pero, básicamente, esta configuración que usas es restrictiva, ya que Ehcache nunca podrá mantener esa cantidad en el disco, con la llave configurada en el montón. Espero que esto aclare un poco.

Si realmente tiene un caso de uso donde tiene que poner mucho en el disco y reducir al mínimo el almacenamiento en montón, es posible que desee ver en http://ehcache.org/documentation/user-guide/storage-options#enterprise-diskstore

+0

que en realidad no la intención de utilizar sólo 1 MB de montón; Lo configuré de esa manera solo para asegurarme de llegar al punto de necesitar desbordar al disco. Voy a usar varios GB de Heap, pero quería asegurarme de tenerlo configurado para que nunca olvide los elementos. –

+0

Supongo que esto responde la pregunta tal como se lo solicitó, así que por favor [vea mi nueva pregunta] (http://stackoverflow.com/q/8980467/387852) para saber si hay alguna manera de asegurarse de que los elementos ** nunca ** se obtengan desalojado de la tienda de discos (en la versión gratuita). –

Cuestiones relacionadas