En una aplicación multiproceso, una buena práctica es aislar los componentes del acceso a la base de datos, la violación de esta práctica puede generar errores de violación de acceso, entre otros errores. Para ayudar a resolver este problema, Embarchadero ha puesto a disposición el componente, FDManager , que es responsable de la definición y gestión de las conexiones y es segura (uso seguro en entornos multitreíces).
Fuente: https://docwiki.embarcadero.com/radstudio/sydney/en/multithreading_(fiedac)
Ventajas del uso de fdmanager
Definición de biblioteca Acceso al cliente a la base de datos. [OPCIONAL]
Centralización de la configuración de conexión con la base de datos.
Centralización de parametrizaciones del componente TFDConnection. (Esta configuración se extiende a toda la FDConnection utilizada en la aplicación)
Además de usar FDManger , una buena práctica y el uso de la técnica de optimizar la conexión de la base de datos, llamada grupo de conexión .
Cuando necesitamos realizar cualquier operación en una base de datos, primero es necesario establecer una conexión con ella, el establecimiento de esta conexión generalmente ocurre a través del protocolo TCP/IP , lo que implica el costo de abrir y cerrar la conexión. Este costo es particularmente significativo en las aplicaciones web donde puede tener un flujo de miles de solicitudes constantes, y cada una generará la apertura y el cierre de la conexión de la base de datos. Una técnica simple para evitar esta constante "jodido" de conexiones es mantener una cierta cantidad de conexiones siempre abiertas (un grupo de conexión) y simplemente reutilizar cuando sea necesario, por lo que disminuye tanto el recurso de la máquina como el tiempo de respuesta de su aplicación.
Este costo para establecer una conexión de base de datos se puede ver en la imagen a continuación utilizando la herramienta Wireshark , podemos ver la cantidad de paquetes que se usan para realizar una selección simple.
Podemos ver en la imagen debajo del comportamiento de las consultas de bases de datos utilizando el grupo de conexiones:
Para configurar un grupo de conexión utilizaremos el FDManager y las propiedades del grupo.
| Parámetro | Descripción | Ejemplo |
|---|---|---|
| Agrupado | Activa el grupo de conexión para un nombre de conexión informado en fdmanager.connectationndefs. Para usar un grupo de conexión, la definición de conexión debe ser persistente o privada. | Verdadero |
| Pool_cleanuptimeOut | El tiempo en milisegundos hasta que Firedac elimina las conexiones que no se usaron hasta el tiempo de Pool_ExpiretimeOut. El valor predeterminado es de 30000 ms (30 segundos). | 15000 ms 15 s |
| Pool_expiretimeOut | El tiempo en milisegundos, después de lo cual la conexión inactiva puede excluirse de la piscina y destruirse. El valor predeterminado es 90000 ms (90 segundos). | 60000 ms 60 s |
| Pool_maximumemtes | El número máximo de conexiones en la piscina. Cuando la aplicación requiere más conexiones, se genera una excepción. El valor predeterminado es 50. Cuando se alcanza el número total de conexiones especificadas en esta propiedad, se genera una excepción: | 100 |
En general, el FDManager mantiene un grupo de conexiones "físicas" abiertas cuando:
Para usar FDManager con otras bases de datos, verifique el enlace: Conectividad de la base de datos (FirEDAC) #Driver Linkage
| Base de datos | Conductor | TfdconneneDefpass | Unidades |
|---|---|---|---|
| Microsoft SQL Server | MSSQL | Tfdphysmsssqlonneonefpass | Firedac.phys.mssqltef, Firedac.stan.intf, Firedac.phys, Firedac.phys.odbcbase, Firedac.phys.mssql |
| Servidor oracle | Ahora | Tfdphysoracleconnecontefpass | Firedac.phys.oracledef, Firedac.stan.intf, Firedac.phys, Firedac.phys.oracle |
| Postgresql | Pg | Tfdphyspgconneonecentefpass | Fiedac.phys.pgdef, Firedac.stan.intf, Firedac.phys, Firedac.phys.pg; |
| Servidor mysql | Mysql | Tfdphysmysqlconneonefass | Firedac.phys.mysqltef, Firedac.stan.intf, Firedac.phys, Firedac.phys.mysql |
| Servidor IBM DB2) | DB2 | Tfdphysdb2connectionAlefParams | Firedac.phys.db2def, Firedac.stan.intf, Firedac.Phys, Firedac.Phys.odbcbase, Firedac.Phys.DB2 |
| Pájaro de fuego | pensión completa | Tfdphysfbconneontefpass | Firedac.phys.fbdef, Firedac.stan.intf, Firedac.phys, Firedac.phys.ibbase, Firedac.phys.fb |
| Interbasa | Ib | Tfdphysibconneonecendefpass | Firedac.phys.ibdef, Firedac.stan.intf, Firedac.phys, Firedac.phys.ibbase, Firedac.phys.ib |
| Sqlite | Sqlite | TfdphyssqliteconnectionAnfparams | Fiedac.stan.exprfuncs, Firedac.phys.sqlitedef, Firedac.stan.intf, Firedac.phys, Firedac.phys.sqlite |
| Mongodb | Mongo | TfdphysmongoconneottoneDefpass | Firedac.phys.MongoDbdef, Firedac.stan.intf, Firedac.phys, Firedac.phys.MongoDB |
| ODBC | ODBC | Tfdphysodbcconneonecentefpass | Firedac.phys.odbcdef, Firedac.stan.intf, Firedac.phys, Firedac.Phys.odbcbase, Firedac.phys.odbc |
Adjunto en el proyecto hay dos ejemplos de uso de la conexión de la base de datos en entornos multiproceso.
Primer ejemplo, utilizando conexiones en un entorno de lectura múltiple para escritorio .
2do ejemplo, utilizando conexiones en un entorno de lectura múltiple para servidor web con caballo.
Ambos ejemplos usan la base de datos de Firebird