Connexion à la base de données Postgres réutilisable pour les insertions de lignes dans Go : résolution de l'épuisement du pool de connexions
L'objectif est d'utiliser une connexion à la base de données Postgres unique et réutilisable pour les insertions de lignes dans Go. L'erreur provient du fait que le code ouvre par inadvertance plusieurs connexions en raison d'une mauvaise gestion des connexions.
Le mécanisme de pool de connexions de Postgres, sql.DB, maintient un cache de connexions plutôt qu'une seule connexion. Il alloue dynamiquement les connexions selon les besoins, jusqu'à la limite de connexion maximale du serveur Postgres. Cependant, les connexions ne sont pas libérées correctement lors de l'utilisation de QueryRow sans appeler Scan sur la valeur Row renvoyée.
L'objet Row, contenant en interne une instance Rows, gère sa propre connexion. Ce n'est que lorsque Scan est invoqué que la connexion est automatiquement libérée. Négliger d'appeler Scan maintient la connexion occupée, obligeant DB à ouvrir de nouvelles connexions lors des appels QueryRow suivants. Comme cela se produit sans que les connexions soient libérées, le pool s'épuise et le problème apparaît.
Pour résoudre ce problème, vous pouvez adopter l'une ou l'autre approche :
Voici un extrait de code révisé qui intègre ces modifications :
// ... func main() { // ... // msg handling sqlStatement := ` INSERT INTO heartbeat ("Legend", "Status", "TimeStamp") VALUES (, , ) ` row := db.QueryRow(sqlStatement, Legend, Status, TimeStamp) row.Scan(&dummy) // dummy variable to discard the result // ... } // ...
Cela garantit que les connexions sont libérées rapidement, empêchant ainsi l'épuisement du pool de connexions de base de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!