![]() |
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. |
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. |
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.
|
Cita:
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. |
Cita:
|
Aquí por ejemplo se habla de lo que comentaba en el post anterior.
|
Cita:
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. |
<<<<<<<<<<<<<<<<<<
|
>>>>>>>>>>>>>>>>>>>
|
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:
Cita:
|
¡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 |
Cita:
|
La franja horaria es GMT +2. Ahora son las 06:56:08. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi