Réaliser un pool de connexion DB avec Golang

en premier

J'ai fini par parler de pools de connexions utilisant GCP. L'erreur «Le nombre maximum de connexions a dépassé 100» se produit. C'est une solution que j'ai trouvée en cherchant pourquoi le nombre de connexions augmente.

environnement

Cloud: GCP Serveur WEB Vue / CloudRun Serveur d'API Golang / CloudRun Serveur de base de données MySQL / CloudSQL

Cause

Chaque fois que je frappe l'API, une nouvelle connexion est établie entre le serveur API et le serveur DB.

S'est avéré.

En d'autres termes, la connexion n'a pas pu être réutilisée.

Contre-mesures

Utilisez la méthode suivante dans database.sql pour définir le pool de connexions. En outre, il semble que ORM puisse également être utilisé pour le regroupement de connexions.

Nom de la méthode Explication
func (db *DB) SetMaxOpenConns(n int) Définissez le nombre maximum de connexions. Définissez n sur une valeur de 0 ou moins et le nombre de connexions est illimité.
func (db *DB) SetMaxIdleConns(n int) Définissez le nombre maximal de connexions dans le pool de connexions.
func (db *DB) SetConnMaxLifetime(d time.Duration) Définissez l'heure à laquelle la connexion peut être réutilisée. En définissant d sur une valeur de 0 ou moins, il peut être réutilisé pour toujours.

Mis en œuvre comme suit.

DBconnection


func NewLocalDBConnection() error {
	/* ===== connect datebase ===== */
	// user
	user := os.Getenv("MYSQL_USER") 
	// password
	password := os.Getenv("MYSQL_PASSWORD") 
	// connection database
	database := os.Getenv("MYSQL_DATABASE") 
	// connection host
	host := "localhost" 
	// connection port
	port := "3306" 

	var err error
	DB, err = setupDB("mysql", fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", user, password, host, port, database))
	if err != nil {
		return fmt.Errorf("sql.Open: %v", err)
	}

	return err
}

//this function is a function for connection pooling
func setupDB(Driver string, dsn string) (*sql.DB, error) {
	db, err := sql.Open(Driver, dsn)
	if err != nil {
		return nil, err
	}
	//Définissez le nombre maximal de connexions dans le pool de connexions.
	db.SetMaxIdleConns(100)
	//Définissez le nombre maximum de connexions. Définissez n sur une valeur de 0 ou moins et le nombre de connexions est illimité.
	db.SetMaxOpenConns(100)
	//Définissez l'heure à laquelle la connexion peut être réutilisée. En définissant d sur une valeur de 0 ou moins, il peut être réutilisé pour toujours.
	db.SetConnMaxLifetime(100 * time.Second)

	return db, err
}

Recommended Posts

Réaliser un pool de connexion DB avec Golang
Réaliser un générateur PHP / Python avec Golang / Ruby
Appeler bash avec Golang
Faire fonctionner le conteneur Db2 avec Go
Définir le délai d'expiration de la connexion avec boto3
Premiers pas avec PKI avec Golang ―― 4
Connexion simultanée UDP avec Python
Regroupement de connexions avec Python + MySQL