Cache de sentencias, dialogo pseudo-conversacional y "Tabla" ha sido modificada.

Un problema que me enfrenté la semana pasada y que aun no le encuentro una solución que me convenza es el siguiente:

Problema
Una KB Genexus, con una tabla Clientes, a la cual se le habilita el Cache de sentencias y se especifica que sea una hora, el tiempo que tiene que mantener las sentencias vivas en el cache.

A partir de ese momento la aplicación funciona mucho mas rápido, en una cantidad de consultas.

Cuando un usuario va a modificar un cliente, el cliente no ve los cambios que realiza (por una hora) y tambien le sale muchas veces (cuando quiere modificar 2 veces un mismo cliente) el mensaje:

"Clientes ha sido modificada"

Esto marea mucho a los usuarios, pues no entienden lo que esta pasando, pues no ven los cambios que ellos estan realizando. Esto hace que el usuario no pueda volver a modificar la tabla por una hora.

Solución ?
Este comportamiento es el planeado (o sea no es un error), pero no es lo que esperan los usuarios, por lo que creo que temos que lograr mejorar el control que se tiene desde la aplicacion del cache de sentencias.

Las posibles soluciones que se me ocurren son:
  • Invalidar todo el Cache. Esto implica que cuando se hace un update en una tabla que esta marcada como cacheada, se puede llamar a la sentencia que invalida todo el cache. De esta forma no tendremos el comportamiento no deseado, pero es algo demasiado drastico.
  • Invalidar las sentencias del cache que usan la tabla actualizada. Se podria implementar algo que permita borrar del cache las sentencias que contienen la tabla que acaba de actualizarse. Seria que al hacer un update o un delete en la transaccion se deberia recorrer el cache de sentencias para borrar las que utilicen dicha tabla.
  • Que las transacciones no usen el cache de sentencias para las tablas que actualizan.
  • Que las transacciones utilicen la misma sentencia "select" para recuperar los valores y para volver a chequearlos, de forma de evitar el mensaje de error (aunque no se vea el cambio).
  • No usar dialogo pseudo-conversacional.No me gusta demasiado, pero creo que es la unica que queda.
  • No usar transacciones para las tablas cacheadas. Implica utilizar webpanels y procedmientos para hacer los updates.
Ninguna de estas soluciones me gustan demasiado, pero creo que por ahora voy a deshabilitar el manejo del dialogo pseudo-conversacional, cambiando el config.gx, poniendo PSEUDO_CHECK=N.

Si alguien ya pasó por algo similar y tiene alguna solución mejor, le agradeceria si puede compartirla.

Comentarios

Entradas más populares de este blog

Aplicación monolítica o distribuida?

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

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