Dans une application Multithread, une bonne pratique consiste à isoler les composants de l'accès à la base de données, la violation de cette pratique peut générer des erreurs de violation d'accès parmi d'autres erreurs. Pour aider à résoudre ce problème, Embarchadero a mis à disposition le composant, FDManager , qui est responsable de la définition et de la gestion des connexions et est une file d'attente (utilisation sûre dans des environnements multithread).
Source: https://docwiki.embarcadero.com/radstudio/sydney/en/multithreading_(fiedac)
Avantages de l'utilisation de FdManager
Définition de la bibliothèque L'accès client à la base de données. [FACULTATIF]
Centralisation des paramètres de connexion avec la base de données.
Centralisation des paramétrisations du composant TFDConnection. (Cette configuration s'étend à toute la FDConnection utilisée dans l'application)
En plus d'utiliser FDManger , une bonne pratique et l'utilisation de la technique d'optimisation de la connexion de la base de données, appelée pool de connexions .
Lorsque nous devons effectuer une opération sur une base de données, il est d'abord nécessaire d'établir une connexion avec elle, l'établissement de cette connexion se produit généralement via le protocole TCP / IP , impliquant le coût d' ouverture et de fermeture de la connexion. Ce coût est particulièrement important dans les applications Web où vous pouvez avoir un flux de milliers de demandes constantes, et chacune générera l'ouverture et la fermeture de la connexion de la base de données. Une technique simple pour éviter cette "baise" constante de connexions consiste à maintenir un certain nombre de connexions toujours ouvertes (un pool de connexions) et simplement à réutiliser lorsque cela est nécessaire, vous réduisez donc à la fois la ressource de la machine dépensée et le temps de réponse de votre application.
Ce coût pour établir une connexion de base de données peut être vu dans l'image ci-dessous à l'aide de l'outil Wireshark , nous pouvons voir la quantité de paquets utilisés pour effectuer un simple sélection.
Nous pouvons voir dans l'image ci-dessous le comportement des requêtes de base de données à l'aide du pool de connexions:
Pour configurer un pool de connexions, nous utiliserons le FDManager et les propriétés du pool.
| Paramètre | Description | Exemple |
|---|---|---|
| Mis en commun | Active le pool de connexion pour un connexion de connexion informe dans fdManager.ConnectationNdefs. Pour utiliser un pool de connexion, la définition de la connexion doit être persistante ou privée. | Vrai |
| Pool_cleanuptimeout | Le temps en millisecondes jusqu'à ce que FIREDAC supprime les connexions qui n'étaient pas utilisées avant le temps de pool_expiretimeout. La valeur par défaut est de 30000 ms (30 secondes). | 15000 ms 15 s |
| Pool_expiretimeout | Le temps en millisecondes, après quoi la connexion inactive peut être exclue de la piscine et détruite. La valeur par défaut est de 90000 ms (90 secondes). | 60000 ms 60 s |
| Pool_MaxiMumemtes | Le nombre maximum de connexions dans la piscine. Lorsque l'application nécessite plus de connexions, une exception est générée. La valeur par défaut est 50. Lorsque le nombre total de connexions spécifiés sur cette propriété est atteint, une exception est générée: | 100 |
En général, le FdManager garde un pool de connexions "physiques" ouvertes lorsque:
Pour utiliser FDManager avec d'autres bases de données, consultez le lien: liaison de la base de données (FIREDAC) #Driver Linkage
| Base de données | Chauffeur | Tfdconneneondefpass | Unités |
|---|---|---|---|
| Microsoft SQL Server | MSSQL | Tfdphyssssqlonneonefpass | FIREDAC.PHYS.MSSQLDEF, FIREDAC.STAN.INTF, FIREDAC.PHYS, FIREDAC.PHYS.ODBCBASE, FIREDAC.PHYS.MSSQL |
| Serveur Oracle | Maintenant | Tfdphysoracleconnecontefpass | Tiredac.phys.oracelef, tiredac.stan.intf, tiredac.phys, tiredac.phys.oracle |
| Postgresql | P. | TfdphyspgconneonEndefpass | Fiedac.phys.pgdef, tiredac.stan.intf, tiredac.phys, tiredac.phys.pg; |
| Serveur mysql | Mysql | TfdphysmysqlConneOnefpass | Tiredac.phys.mysqldef, tiredac.stan.intf, tiredac.phys, tiredac.phys.mysql |
| Serveur IBM DB2) | Db2 | Tfdphysdb2connectionandefparams | Tiredac.phys.db2def, tiredac.stan.intf, tiredac.phys, tiredac.phys.odbcbase, tiredac.phys.db2 |
| Oiseau de feu | Fb | Tfdphysfbconneontefpass | Tiredac.phys.fbdef, tiredac.stan.intf, tiredac.phys, tiredac.phys.ibbase, tiredac.phys.fb |
| Interbase | Ib | TfdphysibconneonEndefpass | Tiredac.phys.ibdef, tiredac.stan.intf, tiredac.phys, tiredac.phys.ibbase, tiredac.phys.ib |
| Sqlite | Sqlite | TfdphyssqliteconnectionAndefParams | Fiedac.stan.exprfuncs, tiredac.phys.sqlitetef, tiredac.stan.intf, tiredac.phys, tiredac.phys.sqlite |
| Mongodb | Mongo | Tfdphysmongoconneotondefpass | Tiredac.phys.mongodbdef, tiredac.stan.intf, tiredac.phys, tiredac.phys.mongodb |
| ODBC | ODBC | TfdphysodbcconneonEndefpass | Tiredac.phys.odbcdef, tiredac.stan.intf, tiredac.phys, tiredac.phys.odbcbase, tiredac.phys.odbc |
Ci-joint sur le projet, il existe deux exemples d'utilisation de la connexion de la base de données dans des environnements multithread.
1er exemple, en utilisant des connexions dans un environnement multithreading pour le bureau .
2e exemple, en utilisant des connexions dans un environnement multithreading pour le serveur Web avec Horse.
Les deux exemples utilisent la base de données Firebird