Estoy desarrollando una aplicación web Java que basa su comportamiento a través de grandes archivos de configuración XML que se cargan desde un servicio web. Como estos archivos no son realmente necesarios hasta que se accede a una sección particular de la aplicación, se cargan de forma perezosa. Cuando se requiere uno de estos archivos, se envía una consulta al servicio web para recuperar el archivo correspondiente. Como es probable que algunos de los archivos de configuración se usen mucho, con mucha más frecuencia que otros, me gustaría configurar algún tipo de almacenamiento en caché (con un tiempo de caducidad de aproximadamente 1 hora) para evitar solicitar el mismo archivo una y otra vez.Aplicación web Java: ¿cómo implementar técnicas de almacenamiento en caché?
Los archivos devueltos por el servicio web son los mismos para todos los usuarios en todas las sesiones. No uso JSP, JSF o cualquier otro marco elegante, solo servlets simples.
Mi pregunta es, ¿qué se considera una mejor práctica para implementar un caché estático global en una aplicación web Java? ¿Es apropiada una clase Singleton, o habrá comportamientos extraños debido a los contenedores J2EE? ¿Debo exponer algo en algún lugar a través de JNDI? ¿Qué debo hacer para que mi caché no se atornille en entornos agrupados (está bien, pero no es necesario, tener un caché por servidor agrupado)?
Dada la información anterior, ¿sería una implementación correcta poner un objeto responsable del almacenamiento en caché como un atributo ServletContext?
Nota: No quiero cargar todos ellos en el arranque y hacerse con él porque eso
1). sobrecargar el servicio web cada vez que se inicie mi aplicación
2). Los archivos pueden cambiar mientras mi aplicación se está ejecutando, por lo que tendría que volver a consultarlos de todos modos
3). Todavía necesitaría un caché accesible globalmente, entonces mi pregunta aún es válida
Actualización: Usar un proxy de caché (como squid) puede ser una buena idea, pero cada solicitud al servicio web enviará consultas XML bastante grandes en la publicación Datos, que pueden ser diferentes cada vez. Solo la aplicación web realmente sabe que dos llamadas diferentes al servicio web son en realidad equivalentes.
Gracias por su ayuda
Gracias, pero eso realmente no responde mi pregunta. Si decido usar EHCache, ¿cómo lo configuro dentro de un contenedor java ee para que funcione correctamente en todas las sesiones, varios desorden de cargadores de clases y en entornos agrupados? – LordOfThePigs
No estoy convencido de que Squid sea la solución correcta. Parece tremendamente ingenioso, sin embargo, no creo que los servicios web respeten "si se modifica" – monksy