2011-06-02 39 views
34

ehcache es una bestia enormemente configurable, y los ejemplos son bastante complejos, a menudo implican muchas capas de interfaces.ejemplo de Hello World para ehcache?

¿Alguien ha encontrado el ejemplo más simple que simplemente almacena en caché algo así como un solo número en la memoria (no distribuido, no XML, tan pocas líneas de Java como sea posible). El número se guarda en la memoria caché por ejemplo 60 segundos, luego la siguiente solicitud de lectura hace que obtenga un nuevo valor (por ejemplo, llamando a Random.nextInt() o similar)

Es más rápido/más fácil escribir nuestro propio caché para algo como este con un singleton y un poco de sincronización?

No Spring please.

Respuesta

38

EhCache viene con una configuración a prueba de fallas que tiene un tiempo razonable de caducidad (120 segundos). Esto es suficiente para ponerlo en funcionamiento.

Importaciones:

import net.sf.ehcache.CacheManager; 
import net.sf.ehcache.Element; 

A continuación, crear una memoria caché es bastante simple:

CacheManager.getInstance().addCache("test"); 

Esto crea una caché llamada test. Puede tener muchos cachés diferentes, separados, todos gestionados por el mismo CacheManager. Añadiendo (key, value) pares a esta caché es tan simple como:

CacheManager.getInstance().getCache("test").put(new Element(key, value)); 

Recuperando un valor para una clave dada es tan simple como:

Element elt = CacheManager.getInstance().getCache("test").get(key); 
return (elt == null ? null : elt.getObjectValue()); 

Si se intenta acceder a un elemento después del 120 segundos de caducidad por defecto período, la memoria caché devolverá nulo (de ahí la comprobación para ver si elt es nulo). Puede ajustar el período de caducidad creando su propio archivo ehcache.xml - la documentación para eso es aceptable en el sitio ehcache.

+0

Muy bonito, gracias! Sin embargo, esto no da nada más de un singleton con una comprobación de tiempo de espera (now-updatedat). Lo ideal es que la memoria caché devuelva el resultado anterior mientras se activa y obtiene uno nuevo, para evitar que todos los hilos de lectura se bloqueen durante varios segundos. ¿Puede ehcache hacer esto, o debería seguir usando un singleton y sincronización? ¡Muchas gracias! – wingnut

+0

EhCache, hasta donde yo sé, no tiene funcionalidad incorporada para un control de tiempo en la última actualización. Puede borrar la entrada de la memoria caché al actualizar, o hacer su propia comprobación antes de tomar desde la memoria caché. EhCache tendrá una marca de tiempo de cuando se insertó el objeto, por lo que se hace por usted. También manejará la eliminación de objetos utilizados con poca frecuencia cuando su caché se llene. Finalmente, le permite hacer más cosas en el futuro, si lo desea. Pero, sí, a veces escribir el tuyo es más simple. – jbrookover

+0

gracias por su valiosa respuesta – Jamsheer

13

una implementación funcional de la respuesta de jbrookover:

import net.sf.ehcache.CacheManager; 
import net.sf.ehcache.Element; 
import net.sf.ehcache.Cache; 

public class EHCacheDemo { 
    public static final void main(String[] igno_red) { 
     CacheManager cchm = CacheManager.getInstance(); 

     //Create a cache 
     cchm.addCache("test"); 

     //Add key-value pairs 
     Cache cch = cchm.getCache("test"); 
     cch.put(new Element("tarzan", "Jane")); 
     cch.put(new Element("kermit", "Piggy")); 

     //Retrieve a value for a given key 
     Element elt = cch.get("tarzan"); 
     String sPartner = (elt == null ? null : elt.getObjectValue().toString()); 

     System.out.println(sPartner); //Outputs "Jane" 

     //Required or the application will hang 
     cchm.removeAllCaches(); //alternatively: cchm.shutdown(); 
    } 
} 
+1

Dulce y breve tutorial que utiliza la mayoría de los métodos que las personas que usan EHCache necesitan saber. – Tastybrownies