Maison > développement back-end > Golang > Comment éviter l'épuisement du pool de connexions Postgres lors de l'insertion de lignes dans Go ?

Comment éviter l'épuisement du pool de connexions Postgres lors de l'insertion de lignes dans Go ?

Mary-Kate Olsen
Libérer: 2024-12-13 02:59:09
original
144 Les gens l'ont consulté

How to Avoid Postgres Connection Pool Exhaustion When Inserting Rows in Go?

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 :

  • Utilisez Exec si le résultat de la la requête est insignifiante.
  • Appelez Scan sur la *Row renvoyée pour libérer le connexion.

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

    // ...

}

// ...
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal