Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Conexión a BBDD desde DataSnap (https://www.clubdelphi.com/foros/showthread.php?t=91813)

blaiselaborde 04-05-2017 18:16:10

Conexión a BBDD desde DataSnap
 
Hola;

Tengo un problema con la conexión a la Base de Datos desde mi DataSnap Server:

La Base de Datos es Oracle y el componente de conexión es DOA (Direct Oracle Access).

Si uso un DataSnap Server para TCP/IP el TDSServerClass su LifeCycle es "Server" y cuando se conectan los clientes, los accesos a la Base de Datos por el componente ServerSession del DOA, son secuenciales y por orden de llamada. Este hecho hace que, cuando se ejecuta una Query pesada (o sea que tarda mucho su ejecución), las consultas, de los otros clientes, tienen que esperar a que éste termine para seguir su turno.

Por el contrario, si utilizo el DataSnap para HTTP, el TDSServerClass su LifeCycle es "Invocation", se crea un componente de Conexión con la Base de Datos por cada cliente que accede a uno de los Métodos. Esto salva el obstáculo anterior, pero está causando que los administradores de la BBDD se quejen porque dicen que hay demasiadas sesiones abiertas y que no es normal que se deba abrir una Sesión contra la BBDD para lanzar sólo una Query.

Alguno de ustedes me puede dar alguna sugerencia para solucionar este tema?

Muchas gracias.

jhonny 04-05-2017 19:39:28

Una pregunta que podría cambiar la perspectiva es... ¿El problema es que se abren muchas sesiones o el problema es que se quedan abiertas esas sesiones?

Digo, es que es normal que se abran muchas sesiones debido a que se están abriendo instancias en múltiples hilos, aunque sí se debe cuidar que éstas sean cerradas y los objetos sean liberados. Eso sí, procurando que estas consultas y procesos no sean muy pesados.

WHILENOTEOF 04-05-2017 21:33:14

Firedac tiene una característica y es la de poder reutilizar conexiones para escenarios como el que explicas, y que además sirven para que sea más rápida establecer la conexión. Busca en internet sobre ello porque recuerdo haber leído uno o dos artículos sobre su uso.

blaiselaborde 05-05-2017 10:30:44

Cita:

Empezado por jhonny (Mensaje 516250)
Una pregunta que podría cambiar la perspectiva es... ¿El problema es que se abren muchas sesiones o el problema es que se quedan abiertas esas sesiones?

Digo, es que es normal que se abran muchas sesiones debido a que se están abriendo instancias en múltiples hilos, aunque sí se debe cuidar que éstas sean cerradas y los objetos sean liberados. Eso sí, procurando que estas consultas y procesos no sean muy pesados.



Muchas gracias por tu interés. Lo cierto es que me cuido mucho de cerrar todo lo que se abre, como regla básica en Delphi. Y la crítica que recibo de los Administradores de BBDD es que no debería abrirse una conexión sólamente por una Query, que genera un incremento del número de Sesiones abiertas a medida que entran los clientes. Entiendo que es la forma de trabajar con HTTP.

La otra opción que tengo es mantener una Sesión común para todos los clientes, al buen estilo TCP/IP, pero se me congestionan los accesos con las Queries pesadas.

He estado pensando en tener un Pool controlado de Sesiones abiertas, pero no sé qué tan práctico sería, además que su desarrollo no es nada fácil por el control que habría que tener sobre éllos.

blaiselaborde 05-05-2017 10:31:19

Cita:

Empezado por WHILENOTEOF (Mensaje 516257)
Firedac tiene una característica y es la de poder reutilizar conexiones para escenarios como el que explicas, y que además sirven para que sea más rápida establecer la conexión. Busca en internet sobre ello porque recuerdo haber leído uno o dos artículos sobre su uso.

Muchas gracias. Investigaré el caso que me comentas.

WHILENOTEOF 05-05-2017 10:50:12

Aquí por ejemplo se habla de lo que comentaba en el post anterior.

jhonny 05-05-2017 14:47:12

Cita:

Empezado por WHILENOTEOF (Mensaje 516276)
Aquí por ejemplo se habla de lo que comentaba en el post anterior.

En la documentación que ha dejado WQHILENOTEOF se nota que el manejo de pool de conexiones es mucho más sencillo de lo que parece... lo único a tener en cuenta es lo que ya estás teniendo en cuenta desde el inicio del POST. Que los hilos en datasnap están siendo administrados por el ciclo de vida que le asignas a la sesión.

Sería muy enriquecedor si pruebas la opción como la comenta WHILENOTEOF y nos comentas qué tal te va o cómo te queda.

blaiselaborde 05-05-2017 16:05:39

<<<<<<<<<<<<<<<<<<

blaiselaborde 05-05-2017 16:08:27

>>>>>>>>>>>>>>>>>>>

blaiselaborde 05-05-2017 16:10:03

Gracias por sus comentarios. Han sido muy enriquecedores y me han permitido encontrar la propiedad Pooling en mi componente (DOA) la cual tiene muy buena pinta:

Muestra que existe un par de vías para manejar el Pool:
  • -
Internal: Dónde el mismo componente maneja las Sesiones. Eso sí, toca hacer el Submit y el Rollback por uno mismo antes de cerrar la Sesión.
  • -
MTS (Microsoft Transaction Server) environment: Para versiones de Oracle superiores a 8i, controladas por Oracle de tal modo que no permite hacer el Commit y el Rollback manualmente:

Cita:

Microsoft Transaction Server support
The TOracleSession component provides support for the Oracle Services for MTS. This
service allows you to make use of 2 important concepts of MTS: resource pooling and
transaction control. By setting the Pooling property to spMTS, physical database sessions will
be pooled so that they can be shared between multiple MTS clients. This minimizes the
number of concurrent sessions, and prevents that each client request performs a new logon.
Furthermore, transactions are now controlled at a higher level by MTS, which even allows
distributed transactions in a heterogeneous environment.

jhonny 05-05-2017 17:13:22

¡Estupendo!, me alegra mucho que se haya gestado un norte en este sentido, gracias por compartir.

Nota: Me he reído con el toque de misterio... <<<<< >>>>> :D

newtron 05-05-2017 18:44:22

Cita:

Empezado por jhonny (Mensaje 516296)
Nota: Me he reído con el toque de misterio... <<<<< >>>>> :D

Yo ya estaba mirando primero para la izquierda y luego para la derecha a ver qué había.... :D:D


La franja horaria es GMT +2. Ahora son las 17:07:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi