Cómo cerrar conexión? Delphi, Zeos y Postgres
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? |
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 |
Cita:
// Saludos |
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. |
Solucionado!
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 |
La franja horaria es GMT +2. Ahora son las 04:07:40. |
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