2012-05-04 17 views
8

Como se dijo en EhCache documentation:carga Ehcache contenidos en la memoria diskstore

En la práctica esto significa que la persistencia de en memoria caché se pondrá en marcha con todos sus elementos en el disco. [...] Entonces, el diseño de Ehcache no los carga todos en la memoria en el arranque, sino que los carga de forma lenta según sea necesario.

Me gustaría que el inicio de la memoria caché guarde todos sus elementos en la memoria, ¿cómo puedo lograr eso?

La razón de esto es que nuestro sitio web realiza un lote de acceso al caché, por lo que la primera vez que visitamos el sitio web tiene muy mal tiempo de respuesta.

+0

Se puede recorrer todas las entradas en el arranque? –

+0

Eso es lo que hago actualmente, pero la forma en que se hace es muy lenta (llamo a los métodos de alto nivel en bucles, y esos métodos de alto nivel también hacen solicitudes de DB). Si hubiera una manera de iterar simplemente en todas las entradas directamente con la API de EhCache, eso podría ser bueno. –

Respuesta

4

Supongo que todos los elementos almacenados en caché están en DiskStore y desea que estén en la memoria tan pronto como se inicie la aplicación. En cualquier caso, usar BootStrapCacheLoader y BootstrapCacheLoaderFactory debería ser útil.

sólo estoy dando idea de dónde cargamos DiskStore en memeory después de la aplicación se inicia

Puede implementar BootstrapCacheLoader que cargará los elementos de caché de la siguiente manera. Definición del método BootstrapCacheLoader.carga (caché Ehcache) puede haber

 //CustomBootstrapCacheLoader implements BootstrapCacheLoader 


     List<?> keys = cache.getKeys(); 

     if ((keys == null) || keys.isEmpty()) 
     { 
      return; 
     } 

     for (Object key : keys) 
     { 
      Element el = cache.getQuiet(key); 
      cache.removeQuiet(key); 
      cache.putQuiet(el); 
     } 

Sobre método lee el elemento de diskcache, lo quita y pone de nuevo para que se mantenga en la memoria y se elimina la versión de disco.

Implementar BootstrapCacheLoaderFactory modo que

public class CustomBootstrapCacheLoaderFactory extends BootstrapCacheLoaderFactor 
{ 
. 
. 
@Override 
public BootstrapCacheLoader createBootstrapCacheLoader(Properties properties) 
{ 
    CustomBootstrapCacheLoader loader = new CustomBootstrapCacheLoader(); 
    loader.setAsynchronous(getAsyncFromProperty(properties)); 

    return loader; 
} 
. 
. 
} 

Puede definir la configuración de la memoria caché de la siguiente manera con CustomBootstrapCacheLoaderFactory como a continuación

<cache 
     name="DummyCacheEl" 
     maxElementsInMemory="3500" 
     eternal="true" 
     overflowToDisk="false" 
     diskPersistent="true" 
     memoryStoreEvictionPolicy="LRU"> 
     <bootstrapCacheLoaderFactory class="CustomBootstrapCacheLoaderFactory" properties="async=true"/> 
</cache> 
+2

+1 para BootstrapCacheLoader. Una pequeña sugerencia en su código para eliminar del disco y cargarlos en la memoria, Elemento el = cache.removeAndReturnElement (clave); Recomendaría este enfoque en lugar de hacer una obtención y luego eliminar el elemento. –

+0

Es cierto, pero lo notifica a CacheEventListener. Puede no ser necesario cuando está iniciando el caché. – Chandra

+0

Sí, así que en caso de que no haya ningún notificador configurado para ese caché, esto ayudará a mejorar el rendimiento. –

0

No he utilizado Ehcache antes, pero en base a la documentación, me gustaría probar estos métodos:

devuelve una lista de todos los elementos en la memoria caché, si no están caducados Las claves devueltas son únicas y pueden considerarse un conjunto.

La lista devuelta no es en vivo. Es una copia.

El tiempo tomado es O (n).

Un cheque extremadamente caro para ver si existe el valor en la memoria caché.

  • Como alternativa, puede construir una (n agregada) query que tocar todos los objetos en la memoria caché. Según entiendo, la caché podría tener extra configuration requirements para poder buscarla.

En todos los métodos anteriores, la idea es ejecutar una operación que toque todos los elementos de la memoria caché, con la esperanza de que el toque traiga elementos almacenados en el disco a la memoria.