Etiqueta

30 agosto 2019

Acceso a datos con aplicaciones Web

Una buena práctica cuando estamos creando aplicaciones para la Web con Omnis Studio, consiste en la creación de un grupo de sesiones (session pool) para controlar el acceso a datos por parte de los usuarios de la aplicación Web. La idea es otorgar a cada usuario activo de la aplicación una sesión individual de acceso a datos, mejorando así los tiempos de acceso, ya que la base de datos podrá atender simultáneamente las peticiones de cada uno de los clientes.


El método Omnis que nos permite hacer esto se denomina $makepool, puesto que Omnis creará el grupo de sesiones de modo global (bajo $root), parece lógico invocarlo desde un método (por ejemplo $acceso) situado en la clase "Startup_Task" y que será ejecutado desde su $construct. Eso garantizará que cada vez que se haga disponible nuestra aplicación Web (se abra la librería) el grupo sea automáticamente creado. El código será algo como esto:

Do $extobjects.PGSQLDAM.$objects.PGSQLSESS.$makepool('myPool',1,'192.168.10.10','myUser','myPassword') Returns iMyPoolRef

El segundo parámetro (1 en el ejemplo) es el número de sesiones de que constará el grupo inicialmente, lo cual no plantea ningún problema, ya que todo "session pool", dispone de propiedades que nos permiten (entre otras cosas) aumentar ésta cifra según surja la necesidad debido al incremento en el número de usuarios que esten haciendo uso de la aplicación Web, o simplemente conocer su cifra actual.

El primer parámetro del método $makepool es el nombre que identifica al grupo de sesiones de modo único. Dado que su existencia es global (nivel $root), deberá eliminarse cuando se destruya su "Startup_Task"". Esto significa que no podrá existir otro grupo de sesiones con el mismo nombre. La variable "iMyPoolRef" nos permite referenciar al grupo creado, pero tambien disponemos de un modo para conocer todos los posibles y diferentes grupos de sesiones que puedan llegar a existir bajo un mismo servidor de aplicaciones Omnis, en $sessionpools.

Para cerrar el grupo de sesiones, usaremos el siguiente código situado en el método $destruct de nuestra clase "Startup_Task":

Do $sessionpools.$remove(iMyPoolRef)

Note que "iMyPoolRef" es una variable de instancia y tipo "Item Reference" cuyo valor ha sido asignado por el método $makepool.

Ahora explicaremos cómo solicitar una nueva sesión al grupo, con el fin de otorgársela al usuario durante el tiempo que esté usando nuestra aplicación Web, para ello usaremos el metodo $new. Con éste fin crearemos un nuevo método en nuestra clase "Startup_Task" al que denominaremos $getSessionFromPool, con el siguiente código:


If iSessionPoolRef.$poolsize=iSessionPoolRef.$inuse
Do iSessionPoolRef.$poolsize.$assign(iSessionPoolRef.$inuse+1)
End If
Quit method iSessionPoolRef.$new()
El tamaño del grupo de sesiones ($poolsize) puede ser aumentado en cualquier momento, nosotros lo haremos comprobando si se ha alcanzado su límite actual ($poolsize=$inuse) y cada vez que requiramos de una nueva sesión. El método $new retornará un nuevo objeto de sesión para acceso a datos.

Ahora nos queda una cuestión importante por resolver, ¿Cómo ejecutar el método $getSessionFromPool ubicado en la calse "Startup_Task" desde una clase "Remote_task"?

Naturalmente necesitamos hacerlo así, ya que queremos asignar la nueva sesión a cada nueva conexión remota. Empezaremos por crear una variable de tipo task, en la clase "Remote_task", donde alojar el nuevo objeto de acceso a datos, la llamaremos "tSessionObj", también resultará lógico que el código para invocar al método $getSessionFromPool lo situemos en el método $construct de la "Remote_task", la respuesta a la pregunta del párrafo anterior sería:

Do $itasks.myLib.$getSessionFromPool() Returns tSessionObj

El literal "myLib" deberá corresponder al nombre de nuestra librería o bien usar la notación [$clib().$name] (importante usar los corchetes) para obtener el nombre de la misma, si optamos por esto último estaríamos garantizando su funcionamiento aunque se llegue a cambiar el nombre asignado inicialmente a la librería.

Esto es todo o casi todo, ahora sólo nos quedaría asignar la sesión (normalmente) a la o las clases "table" que use nuestra aplicación Web, para esto lo más habitual es disponer de una super-clase "table" que será heredada por el resto de clases "table", de ese modo escribiremos nuestro código de asignación de sesión una única vez.

Suponiendo que el nombre de nuestra super-clase es "taSuper", escribiríamos en su método $construct lo siguiente:

Do $cinst.$sessionobject.$assign(tSessionObj)

Naturalmente el resto de clases "table", heredaran este método constructor, aunque también pueden tener el suyo propio, pero si lo usamos, tendremos que utilizar el comando "Do inherited" para ordenar la ejecución del método $construct en la superclase.