Maison >développement back-end >Golang >Comment puis-je réutiliser efficacement les connexions Postgres pour les insertions de lignes dans Go ?

Comment puis-je réutiliser efficacement les connexions Postgres pour les insertions de lignes dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-13 07:53:10429parcourir

How Can I Efficiently Reuse Postgres Connections for Row Inserts in Go?

Réutilisation des connexions Postgres DB pour les insertions de lignes dans Go

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn