PDA

Ver la Versión Completa : Cómo cerrar conexión? Delphi, Zeos y Postgres


mangels
11-04-2007, 13:04:30
Accedo a Postgres a través de Zeos, la aplicación la usan unos 300 usuarios simultáneamente. El problema es que se me quedan las conexiones "idle in transaction" y me peta por exceder el número máximo de usuarios conectados.

Sólo desaparecen los usuarios "idle in transaction" cuando cierran el programa. ¿Cómo se cierra "bien" la conexión? Yo hago lo siguiente:

***************
ZConnection.AutoCommit := true;
ZConnection.Connect;

ZQuery.Connection := ZConnection;
ZQuery.RequestLive := true;
ZQuery.CachedUpdates := false;
ZQuery.SQL.Text := 'bla bla bla';
ZQuery.Open;
...
ZQuery.Close;
ZConnection.Disconnect;

***************

He probado también con ZConnection.Destroy, pero aún así no desaparecen las conexiones del servidor hasta que no cierro el programa. Alguien me puede ayudar?

poliburro
11-04-2007, 16:14:26
Por supuesto que es un grave problema, y la solución es sumamente sencilla.

Solo que debes modificar un poco la manera en que manejas tus conexiónes.

De entrada, todos tus objetos conexión deberán estar en un DataModule, de esta manera despúes de que destruyas la instancia del datamodule solo necesitaras lo siguiente:

ObjectoConexion.Close;
InstanciaDatamodule.Free
InstanciaDatamodule := Nil;

Con esto la conexión será eliminada en postgress.

Ahora, te comento que Con ADO puedes hacer uso de datos en frio, es decir, puedes mantener un dataset con datos resultado de una consulta o de la ejecución de un procedimiento almacenado sin la necesidad de tener abierta la conexión, esto te permite desarrollar aplicaciónes cliente servidor que no necesitan de conexiónes persistentes, logrando un sustancial ahorro de recursos en tu sevridor y oviamente un mejor performance.

Suerte

roman
11-04-2007, 18:39:12
Ahora, te comento que Con ADO puedes hacer uso de datos en frio, es decir, puedes mantener un dataset con datos resultado de una consulta o de la ejecución de un procedimiento almacenado sin la necesidad de tener abierta la conexión, esto te permite desarrollar aplicaciónes cliente servidor que no necesitan de conexiónes persistentes, logrando un sustancial ahorro de recursos en tu sevridor y oviamente un mejor performance.


Esto ¿no puede hacerse también insertando un ClientDataSet y un Provider entre los controles y el Zeos? Lo pregunto porque de esa forma no se tendría que cambiar de componentes.

// Saludos

poliburro
11-04-2007, 18:45:19
Coincido contigo román en que el clientdataset es una buena opción para que no tenga que cambiar su capa de conexión, aunque déjame decirte que al tener postgress un proveedor OleDb, la mejor opción sobre zeos es ADO. :P

pero como te digo, coincido en el uso del clientdataset.

mangels
16-11-2007, 16:00:59
Al final lo he hecho con DataSetProvider y ClientDataSet de la siguiente forma:

1 - Asocio el ZConnection con la base de datos
2 - Asocio el ZQuery con el ZConnection
3 - Asocio al DataSetProvider el ZQuery (propiedad DataSet)
4 - Asocio un ClientDataSet con el DataSetProvider (propiedad ProviderName)

La verdad es que funciona de maravilla. Gracias por la ayuda