2011-04-15 25 views
8

Tenemos una aplicación de middleware Java (J2SE) de alto rendimiento donde la latencia es de suma importancia. Utiliza algunos datos permanentes almacenados en una base de datos heredada, donde una aplicación heredada puede ocasionalmente modificar los datos. Debido al requisito de latencia, estamos planeando almacenar en caché los datos permanentes, utilizando JPA con Hibernate y tal vez un proveedor de caché como Ehcache.Actualización del caché de fondo JPA

Sin embargo, cuando los datos permanentes se actualizan (por la aplicación heredada) necesitamos ser notificados de esto tan pronto como sea posible. Estaba pensando en establecer un vencimiento en la memoria caché, pero luego la memoria caché no se actualizará hasta que la aplicación solicite la siguiente solicitud de datos; en ese momento, la latencia se verá afectada debido a que la base de datos volverá a leerse.

Lo ideal es que necesitemos que el caché devuelva un valor obsoleto, y en el fondo el caché se actualiza/actualiza con el último valor de la base de datos a intervalos regulares.

¿Es esto posible con Ehcache? He visto SelfPopulatingCache y CacheLoader, pero parece que estoy haciendo un montón de trabajo (tendré que escribir el código a mano para cada entidad). Además, ¿alguien tiene un ejemplo de implementación de CacheLoader? Esperaba una opción de actualización asíncrona en Query Cache.

¿Existen otras tecnologías que puedan ofrecer una solución? No estamos obligados por el proveedor de JPA o el proveedor de caché.

¿Podría Spring @Cacheable proporcionar una solución? He visto spring ehcache cachable menciona self-populating-cache-scope, pero no está claro para mí lo que esto significa.

Gracias de antemano.

+0

¿Cuáles son las opciones de integración disponibles en la aplicación heredada? – Santosh

Respuesta

1

Si puede cambiar la aplicación heredada, una opción es enviar avisos de invalidación de caché con algo así como ActiveMQ. Si no puede cambiar la aplicación heredada, otra opción es agregar una columna indexada timestamp/rowversion a su tabla y periódicamente sondear los cambios desde la encuesta anterior.

5

¿Qué base de datos está usted utilizando?

EclipseLink 2.4 proporcionará una función de invalidación de caché controlada por eventos de base de datos. Esto está integrado con la base de datos Oracle DCN/QCN. También es posible que pueda conectar algo con los factores desencadenantes.

http://wiki.eclipse.org/EclipseLink/Examples/JPA/DCN

También puede desear para investigar Oracle GoldenGate, Coherencia y TopLink cuadrícula.

1

No sé cómo hacer esto usando EhCache u otro componente, pero un enfoque común a este problema es "tener 2 cachés". Permíteme explicarte: tienes un caché que sirve tu aplicación con datos (este caché no tendrá ninguna actualización mientras sirve aplicaciones) y otro caché creado por un trabajador programado con la información más reciente (puedes crear un caché cada x segundos o cada vez) recibe un evento que le informa que sus datos han cambiado). Cuando se completa su nueva memoria caché, reemplaza la anterior con la nueva, por lo que la memoria caché de actualización reciente está sirviendo a la aplicación con una latencia de caché de 0. Como puede ver, el problema con este enfoque es que su cliente puede ver datos obsoletos mientras su nueva memoria caché no está completa. Y, por supuesto, es un método muy costoso (tendrá 2 memorias caché en memoria muy a menudo y construirá una nueva memoria caché muy a menudo también).

Cuestiones relacionadas