2012-01-06 9 views
5

quiero utilizar ehcache no solo como un caché sino como un contenedor de objetos sucios que quiero vaciar en mi base de datos cuando los objetos son desalojados/caducados. durante el procesamiento normal, uso una clave para buscar en ehcache. si la clave no está presente, leo los datos de la base de datos y los pongo en ehcache. el valor es en realidad un objeto complejo que modifico. cuando se produce la condición ttl/tiempo de inactividad/desbordamiento, veo que se invocan las devoluciones de llamada de CacheEventListener. pero hay un gran problema se llama al notifyElementExpired después de que el valor-clave se elimina de la memoria caché. entonces hay una condición de carrera. si hago la tarea de enjuagar el valor sucio en caché en notifyElementExpired y, al mismo tiempo, en otro hilo, leo para que ocurra la misma clave, entonces hay un problema de sincronización. el segundo hilo no encontrará el objeto en ehcache, y por lo tanto irá a la base de datos mientras que el otro hilo aún se está preparando para enjuagar.¿este caso de uso puede ser resuelto en ehcache?

intenté experimentar con ehcache de escritura y no creo que eso también funcione.

¿hay alguna solución aquí?

Realmente apreciaría buenas soluciones a este problema, incluso si se trata de algún otro mecanismo de caché que no sea ehcache.

gracias

+0

No pude encontrar ninguna respuesta a esta pregunta yo mismo. ¡Así que fui adelante y lo resolví yo mismo! Esta es la solución sobre la que blogéé - http://blog.readypulse.com/2012/01/08/ehcache-as-a-true-persistent-store-backed-cache/ –

+1

Buen trabajo TVinodGupta. Como recordatorio amistoso, ¿puede por favor enviar una respuesta a la pregunta usted mismo y luego aceptar esa respuesta para que podamos cerrar esta pregunta? Además, debe aceptar respuestas a preguntas anteriores si resuelven su problema. – Zecas

Respuesta

1

Si estás bien con un caché puramente en memoria, me gustaría sugerir la ampliación de la biblioteca de Google Guava CacheLoader, por ejemplo:

public class DBLoader extends CacheLoader<String, String> { 

    @Override 
    public String load(String key) throws Exception { 
     // load a value from the database 
     return value; 
    } 
} 

A continuación, en el uso, algo así como:

private LoadingCache<String, String> dbCache = CacheBuilder.newBuilder() 
.expireAfterWrite(CACHE_EXPIRE_IN_SECONDS, TimeUnit.SECONDS) 
.build(new DBLoader()); 

String value = dbCache.get(someKey); 


Deberá ordenarlo con el manejo de excepciones adecuado, por supuesto.

Creo que guava es mucho más sencillo que configurar ehcache correctamente.

+1

La guayaba tiene sus propias condiciones de carrera: https://github.com/google/guava/issues/1881 – CurtainDog

Cuestiones relacionadas