Variables en Session o Modulos

Estimados una consulta simple (pero me puede estar dando problemas).
Dónde es mejor definir métodos, propiedades, variables globales, dentro del SESSION o crear un modulo genérico para ello?.
Al comienzo de xojo entendí que métodos como apertura de BD iban ahi, asi como por ejemplo identificación del usuario , clave, nombre, etc. y luego en el proyecto las tomaba como session.
Pero también tengo en Modulos, rutinas de grabación en DB que hacen referencia de OPEN al session o variables del usuario registrado que se van a grabar que también estan en el session.

Eso puede ocasionar problemas de “pérdida de memoria”, etc.
No abro webpages desde el Session, pero si consulto sus métodos y propiedades todo el tiempo.

2 Likes

Te recomiendo que uses objetos. Si lo haces de esta forma, siempre es mejor contener todo en una clase.

El link hacia la base de datos, se recomienda tenerlo en Session. Ya que va a ser una variable que estará todo el tiempo en todo el proyecto.

No te recomiendo que estén ahí (en Session), los comandos de Insert, Update y Delete. Mucho menos los procedimientos de la base de datos.

Solo usa Session para obtener la conexión y mantenerla activa en la vida del sistema.

Hola @Jose_Fernandez_del_Valle,
Comienzo por el final, la Session la uso en todos lados del proyecto para Abrir y Cerrar la conexión, NO mantengo la conexión abierta, solo la abro, hago select, insert, update, etc. y luego la cierro, eso anda perfecto.
Las rutinas luego de insert, select, update, mayoritariamente estan en un módulo general, pudiendo haber excepciones donde dentro de un mismo container o webpage tenga algú método que lo realice.
Puede “emprolijarse” más el código como bien dices con clases (asi lo hacia en el VB) pero no creo que eso sea motivo de pérdida de memoria, etc.

Ya que estás, en tu caso, tus aplicaciones web2 trabajan todo el tiempo sin que el servicio “caiga” ?

Buen punto.
A mi no se me ha caído. Quizá se requiere que más personas accedan.

Pero entiendo lo que deseas. Por lo que veo, cuando el usuario esta trabajando con el sistema, se cae sin previo aviso y aparentemente sin razón alguna.

¿Es correcto?

Hola Mauricio, si usas variables en lugares comunes como módulos, el contenido será visible para todos los usuarios y tendrás resultados indeseables. El uso de sesiones asegura que cada usuario (o cada sesión al crearse en el browser), contendrá las variables de dicho usuario (o sesión).
Esto aplica al desplegar las webpages, debes crear una instancia para que los usuarios no puedan compartir contenidos, por ejemplo (Var wp as New MyWebpage) y se despliega la instancia (wp.Show). En entornos web hay que tener cuidado con los contenidos de ciertos objetos.

Hola Jose !

Por favor, menciona lo que no debemos hacer. ¿Que instancias no conviene crear o que contenido?

Para cuidarnos de generar errores.

(En entornos web hay que tener cuidado con los contenidos de ciertos objetos.)

Correcto

Hola a todos, en mi experiencia, sigo lo siguiente:
Objeto APP
Opening: Todo proceso de inicialización en la aplicacion (seriales de plugins, carga de valores iniciales, DAEMONIZE, etc.)
Objeto Session
Variables de sesión para cada usuario (IDUsuario, Nombre del usuario, Empresa a la que se accede). Fundamental para ambientes multiusuario.

WebPages
Organizo en carpetas según el dispositivo (computadoras, tablets, celulares), cada diseño es diferente.
Al llamar una WebPage siempre se crea una instancia:
Var wp As New WebPageAplicacion

En cada WebPage creo una propiedad para almacenar la WebPage que lo invoca para que al retorno se despliegue la WebPage anterior
wp.WebPadre = Self  // Antes de llamar el método Show, se asigna la web padre
wp.Show

Con esta técnica, al finalizar el proceso de esta nueva WebPage y se necesite retornar a la web que la invocó, se puede usar como sigue:
WebPadre.Show
Self.Close

Dentro de cada WebPage, las propiedades, métodos, etc. corresponden a una instancia por lo que funciona los procesos particulares con sus variables.

En cuanto a bases de datos, depende de lo que se use, SQLite con archivo local o un servidor de bases de datos como MySQL. Personalmente desarrollé una función tipo SelectSQL que trabaja con todos los motores de bases de datos. Si se crea la instancia para la conexión, asegurarse de cerrar la conexión al finalizar, debido a que con la aplicación “stand alone” se bloqueaba al día siguiente y no se podía conectar al servidor.

Uso la versión 2021R2.1

Espero haber sido de ayuda, cualquier consulta, a la orden.

3 Likes

Excelente detalle de cada parte, muchas gracias!
Una consulta, cuando tienes un método que es usable en varios puntos, como buscar el nombre de un cliente, se puede tener en módulos generales? y no tenerlos dentro de cada webpage, para no se repetitivo.

Excelente !!!
Gracias por compartirlo.

Yo uso funciones comunes en los módulos como indicas, perfectamente viable. También puedes hacer tu propia clase que puedes compartir y reutilizar en otros proyectos. Ambos funcionan perfectamente.

P.D. También he hecho REST para proveer datos a APP en móviles usando JSON y por parte de Xojo con HandleURL. El Xojo es muy versátil, espero que se cierre el ciclo con desarrollo Android.