2008-12-18 7 views
5

Tengo 2 webapps diferentes (paquete en diferentes archivos war) que necesita compartir algunos datos a través de un caché (ehcache). Quiero probar esta idea con usted para ver si funciona.Accediendo a la misma ehcache desde 2 archivos de guerra diferentes

Mi idea es crear un servicio que arranque/acceda a la ehcache y el paquete dentro de una jarra. Luego paquete que cántaro en las dos guerras:

  • WAR1: ehcache-service.jar
  • War2: ehcache-service.jar

Would Ehcache trabajo en una configuración de este tipo?

+0

¿Podría dar más información sobre lo que está tratando de lograr con la memoria caché compartida? – lucas

+0

Quiero usarlo como un bloqueo distribuido. Podría usar una base de datos para indicar que una transacción está en progreso (pero creo que es un antipatrón). Usecase: War1 inicia un tx, lo almacena en caché. Esto evita que el mismo tx se inicie. War2 invalida tx en función de un evento externo. – ashitaka

Respuesta

5

Necesita crear un jar (s) separado con todas las clases (y todas sus dependencias) qué instancias tiene previsto almacenar en caché y luego implementar este jar y ehcache.jar como una biblioteca (dependiendo de qué servidor de aplicaciones utilizar el procedimiento puede ser diferente), en el caso de Tomcat 6 eso significa simplemente copiar los archivos jar a la carpeta lib.

Lo que sucede entonces es que ehcache y sus clases de dominio serán cargadas por el cargador de clases compartido por todas las aplicaciones web, por lo que las instancias se guardarán en la memoria caché.

Las dependencias de las clases de su dominio son importantes, por lo que debería ver si este enfoque es factible en su proyecto. También podría afectar la forma en que reinicia las aplicaciones web.


Además, debe tener en cuenta que la caché y el uso compartido no son necesariamente lo mismo. La memoria caché es una optimización. Si coloca una instancia de objeto en la memoria caché, es posible que se desaloje de inmediato si, por ejemplo, la memoria caché no tiene suficiente espacio de almacenamiento o la configuración de la política de desalojo. Entonces puede ser que tenga que revisar la forma en que planea usar ecache en general.

+0

Estoy usando Tomcat para que las bibliotecas compartidas por todos los webapps entren en CATALINA_HOME/common/lib. Hay un problema más complicado ya que quiero replicar el caché en múltiples servidores tomcat en un clúster. – ashitaka

+0

Me gusta su declaración "La memoria caché es una optimización". Podría necesitar volver a utilizar la base de datos para almacenar el estado compartido porque puedo usar el nivel de aislamiento SERIALIZABLE para garantizar lecturas y escrituras consistentes. – ashitaka

2

El problema de su configuración es que cada guerra se cargará con ClassLoader por separado y habrá dos instancias de su servicio de ehcache: cada aplicación web tiene su propia copia de servicio. Puede implementar su servicio de caché como un servicio web (por ejemplo) y usarlo desde war1 y war2.

Cuestiones relacionadas