web-dev-qa-db-fra.com

Est-ce que gorm.open () crée une nouvelle piscine de connexion à chaque appel à une nouvelle connexion?

Je travaille sur un morceau de code qui appelle à la base de données à partir de plusieurs endroits différents. Dans ce code, j'ai utilisé la bibliothèque de lunettes et appelez gorm.Open() Chaque fois que je dois interagir avec la base de données.

Ce que je me demande, c'est ce qui se passe sous le capot quand j'appelle ça? Un nouveau pool de connexion est-il créé à chaque fois que je l'appelle ou est chaque appel à gorm.Open() Partage du même pool de connexion?

4
Abe Miessler

TLDR: Oui, essayez de réutiliser l'objet DB retourné.

gorm.open Ce qui suit: (plus ou moins):

  1. recherchez le pilote pour le dialecte donné
  2. call sql.Open Pour renvoyer un objet DB
  3. appel DB.Ping() Pour le forcer à parler à la base de données

Cela signifie que l'un sql.DB Est créé pour chaque gorm.Open. Par the the the doc , cela signifie un pool de connexion pour chaque objet DB.

Cela signifie que les recommandations de SQL.OPEN s'appliquent à gorm.Open:

La DB renvoyée est sûre pour une utilisation simultanée par plusieurs goroutines et maintient son propre pool de connexions inactives. Ainsi, la fonction ouverte doit être appelée juste une fois. Il est rarement nécessaire de fermer une dB.

4
Marc

Oui, notez également que le pool de connexion peut être configuré en tant que tel:

// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
db.DB().SetMaxIdleConns(10)

// SetMaxOpenConns sets the maximum number of open connections to the database.
db.DB().SetMaxOpenConns(100)

// SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
db.DB().SetConnMaxLifetime(time.Hour)
0
robbieperry22