Introduction
Lors de la gestion des connexions Postgres dans Go, il est crucial de utiliser efficacement les connexions pour éviter les goulots d’étranglement en matière de performances et la consommation inutile de ressources. Dans cet article, nous explorerons comment réutiliser efficacement une seule connexion à la base de données Postgres pour les insertions de lignes à l'aide du pool sql.DB.
Le problème : plusieurs connexions ouvertes
Le code fourni ouvre plusieurs connexions à la base de données, épuisant le pool de connexions et provoquant l'échec des opérations d'insertion. Cela se produit car la méthode db.QueryRow() ne libère pas correctement la connexion après l'exécution de la requête.
Comprendre sql.DB
sql.DB est une connexion pool qui gère et réutilise automatiquement les connexions. Il crée de nouvelles connexions uniquement en cas de besoin, dans la limite d'une limite définie par le serveur de base de données.
Le problème : appel d'analyse manquant
Dans le code, db.QueryRow( ) est utilisé sans appeler la méthode Scan sur la valeur *Row renvoyée. Sous le capot, *Row contient une connexion qui est libérée lorsque Scan est invoqué. Sans appeler Scan, la connexion reste ouverte, ce qui entraîne une accumulation de connexions et des problèmes de performances.
La solution : gérer correctement *Row
Pour résoudre le problème, soit utilisez Exec si le résultat de la requête n'est pas nécessaire, ou appelez Scan sur la *Row renvoyée pour libérer la connexion associée.
Mise à jour Code
Le code mis à jour suivant libère correctement la connexion à l'aide de Scan :
sqlStatement := ` INSERT INTO heartbeat ("Legend", "Status", "TimeStamp") VALUES (, , ) ` row := db.QueryRow(sqlStatement, Legend, Status, TimeStamp) var result int if err := row.Scan(&result); err != nil { log.Fatal("Error scanning query result:", err) }
Vous pouvez également utiliser Exec si la requête ne renvoie aucun résultat :
sqlStatement := ` INSERT INTO heartbeat ("Legend", "Status", "TimeStamp") VALUES (, , ) ` if _, err := db.Exec(sqlStatement, Legend, Status, TimeStamp); err != nil { log.Fatal("Error executing query:", err) }
En gérant correctement les connexions *Row et en libérant, vous pouvez garantir une utilisation efficace des connexions à la base de données, améliorant ainsi les performances et la fiabilité.
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!