HOW TO: Habilitar el cache de sentencias en una aplicación GeneXus.

La habilitación de cache de sentencias en aplicaciones Genexus es una tarea muy sencilla, pero que hay que realizarla con cuidado para poder tener buenos resultados.

Los resultados, en mejora de performance, han sido muy buenos, bajando en 30% los tiempos de ejecución de algunos procesos.

Lo primero que hay que hacer, es realizar una clasificación de la tablas que posee mi sistema, según la frecuencia con que se cambian los registros de las mismas. También es importante ver que tanto me afectaría si un registro de la misma es modificado y cuanto puede esperar el resto de la aplicación, para ver los resultados.

Frecuencia de Cambio

MUY BAJA - Tablas de parámetros / Metadatos que no se modifican
BAJA - Datos básicos de baja volatilidad y baja criticidad (Sucursales, Empresas, Rubros, productos)
ALTA - Pueden ser productos, empresas, etc (aunque tengan un ritmo de actualizacion baja, son criticos)
MUY ALTA - Movimientos de stock, documentos, logs, etc, No cacheable, son la mayoria de las tablas

Una vez clasificadas las tablas, se debe asignar esa clasificación a las tablas del sistema, en las propiedades asociadas de la tabla.

Luego alcanza con hacer un Build all forzado de toda la aplicación.

Para comenzar, conviene ponerle un TTL (Tiempo en que las sentencias van a estar vivas) bajo para todas las tablas, de tal forma de no tener grandes problemas de arranque y tener la certeza que los cambios van a ser vistos en poco tiempo.

Despues alcanza con cambiar el client.cfg, server.cfg (en java) o web.config o cliente.exe.config (en .NET) para tener ya habilitado el cache de sentencias para toda la aplicación.

UPDATE: En ocasiones, se necesita poder cambiar una tabla e invalidar todo el cache de sentencias, de forma de que tome el cambio. Por ejemplo, si cambio la tabla donde se manejan los porcentajes de los impuestos y necesito que empiece a regir inmediatamente, debo invalidar todas las sentencias que hacen referencia a dicha tabla.
Una forma de resolverlo en aplicaciones WEB es borrando TODAS las sentencias del cache.
Esto se logra de la siguiente forma:

El comando a usar en .NET es:
csharp GeneXus.Cache.CacheService.Instance.Flush(); 

El comando a usar en JAVA es:
java com.genexus.db.ResultCache.restartCache();



Comentarios

Entradas más populares de este blog

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Aplicación monolítica o distribuida?

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.