Caché avanzado de Objetos
Como podéis observar, poco a poco vamos subiendo el nivel de nuestros
tutoriales. En uno de los últimos, os describíamos como empezar a pensar
utilizando
patrones de diseño. Hoy vamos a continuar planteándonos como utilizar una
solución de caché para Java.
Antes de complicarnos la vida diseñando un sistema de cacheé, es muy posible
que debiéramos buscar por Internet, en los sitios habituales, para ver que es lo
que hay sobre el tema.
Sitios habituales son:
- Por supuesto, www.google.com (aunque
es fácil perderse) - www.aparche.org
- www.sourceforge.org
En el mundo Java, no debemos olvidar como se definen las especificaciones
nuevas. Esto es a través de JCP (Proceso Comunitario Java)
Pues, que sorpresa 😉 , que ya hay una especificación en marcha, la JSR 107….
Buscando, podemos encontrar que hay un producto recomendado para obtener
funcionalidades de caché, se llama OSCACHE.
Podemos encontrar este producto y otros con licencia gratuita en
http://www.opensymphony.com
Una vez descargado el fichero ZIP con las librerías y documentación, para que
nuestra prueba de concepto funcione, podemos establecer una estructura de
ficheros como la descrita a continuación (cuesta un poquito llegar a esta
conclusión siguiendo la documentación)
D:. │ jspcacheado.jsp │ └───WEB-INF │ oscache.tld │ web.xml │ ├───cache ├───classes │ oscache.properties │ └───lib commons-collections.jar commons-logging.jar oscache-2.0.2-22Jan04.jar |
Debemos modificar el fichero web.xml para hacer referencia a la librería de
TAGS:
<taglib> <taglib-uri>oscache</taglib-uri> <taglib-location>/WEB-INF/oscache.tld</taglib-location> </taglib> |
También tenemos que tocar el fichero de configuración oscache.properties
e indicar el directorio donde cachear contenidos persistentes.
# CACHE DIRECTORY # # This is the directory on disk where caches will be stored by the DiskPersistenceListener. # it will be created if it doesn't already exist. Remember that OSCache must have # write permission to this directory. # # Note: for Windows machines, this needs \ to be escaped # ie Windows: # cache.path=c:\\myapp\\cache # or *ix: # cache.path=/opt/myapp/cache # cache.path=d:\\cacheadictos\\WEB-INF\\cache |
Nuestro JSP, hace referencia a una librería de etiquetas para poder disponer
del juego de TAGS que nos ayudarán en nuestro trabajo:
<%@ taglib uri=»oscache» prefix=»cache» %>
Declarar una área que queremos cachear es tan sencillo como incluir un bloque
como este:
<cache:cache key=»zona1″ scope=»application» duration=»10″>
…lo que sea
</cache:cache>
Dependiendo del tipo de aplicación y ámbito del elemento a
cachear podemos jugar con los distintos modificadores: key, scope y duration
(ver la documentación para más detalles y otras etiquetas relacionadas).
Nosotros hemos especificado que queremos que todos los usuarios dispongan de
este contenido cacheado y que se refresque cada 10 Segundos.
Para probar que se comporta como deseamos, vamos a poner un
retardo en un área y ejecutar varias veces la consulta…. el resultado os va a
sorprender.
Como casi siempre en este Web, fijaos más en el fondo que en la
forma…..
<%@ taglib uri="oscache" prefix="cache" %> <%@page contentType="text/html"%> <html> <head><title>JSP Page</title></head> <body> <%! int contador = 0; %> <center> <h1>Ejemplos de Caches con OSCache</h1> <% long inicio = System.currentTimeMillis(); contador ++; %> <br> <cache:cache key="zona1" scope="application" duration="10"> <% try { Thread.currentThread().sleep(3000); java.util.Date fecha = new java.util.Date(); out.println("Este es el mensaje" + fecha); } catch(Exception e){} %> </cache:cache> <br> <% long fin = System.currentTimeMillis() - inicio; out.println("El tiempo transcurrido completo es: " + fin + " milisegundos y el contador es: " + contador); %> </center> </body> </html> |
Ésta es la salida de la página…..Podemos ver la primera
ejecución
En una aplicación normal, el tiempo debería ser siempre superior
a tres segundos …. pero vemos que efectivamente el tiempo de la segunda
petición tiende a cero…
Conclusiones
Este ejemplo puede ser muy útil cuando trabajamos con el patrón de diseño MVC
tipo 1 (JSPs que utiliza JavaBeans o etiquetas para acceder a estructuras de
datos). Si seguimos investigando en el producto, pronto veremos que existe un
modelo de objetos equivalente para aplicaciones que utilicen otro tipo de
diseños como MVC tipo 2 o aplicaciones tradicionales.
Como comprobamos reiterativamente, necesitamos pararnos a probar y diseñar
para que nuestro sistemas sean efectivos. Necesitamos tiempo …
Yo tengo tiempo y tu empresa necesidades de formación o consultoría avanzada
¿hablamos? rcanales@autentia.com