Realisieren Sie den DB-Verbindungspool mit Golang

zunaechst

Am Ende habe ich über Verbindungspools mit GCP gesprochen. Der Fehler "Maximale Anzahl von Verbindungen hat 100 überschritten" tritt auf. Es ist eine Lösung, die ich gefunden habe, indem ich untersucht habe, warum die Anzahl der Verbindungen zunimmt.

Umgebung

Cloud: GCP WEB-Server Vue / CloudRun Golang / CloudRun API-Server DB-Server MySQL / CloudSQL

Ursache

Jedes Mal, wenn ich auf die API drücke, wird eine neue Verbindung zwischen dem API-Server und dem DB-Server hergestellt.

Hat sich herausgestellt.

Mit anderen Worten, die Verbindung konnte nicht wiederverwendet werden.

Gegenmaßnahmen

Verwenden Sie die folgende Methode in database.sql, um den Verbindungspool festzulegen. Es scheint auch, dass ORM auch für das Verbindungspooling verwendet werden kann.

Methodenname Erläuterung
func (db *DB) SetMaxOpenConns(n int) Stellen Sie die maximale Anzahl von Verbindungen ein. Setzen Sie n auf einen Wert von 0 oder weniger, und die Anzahl der Verbindungen ist unbegrenzt.
func (db *DB) SetMaxIdleConns(n int) Legen Sie die maximale Anzahl von Verbindungen im Verbindungspool fest.
func (db *DB) SetConnMaxLifetime(d time.Duration) Stellen Sie die Zeit ein, zu der die Verbindung wiederverwendet werden kann. Wenn Sie d auf einen Wert von 0 oder weniger setzen, kann es für immer wiederverwendet werden.

Wie folgt implementiert.

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
	}
	//Legen Sie die maximale Anzahl von Verbindungen im Verbindungspool fest.
	db.SetMaxIdleConns(100)
	//Stellen Sie die maximale Anzahl von Verbindungen ein. Setzen Sie n auf einen Wert von 0 oder weniger, und die Anzahl der Verbindungen ist unbegrenzt.
	db.SetMaxOpenConns(100)
	//Stellen Sie die Zeit ein, zu der die Verbindung wiederverwendet werden kann. Wenn Sie d auf einen Wert von 0 oder weniger setzen, kann es für immer wiederverwendet werden.
	db.SetConnMaxLifetime(100 * time.Second)

	return db, err
}

Recommended Posts

Realisieren Sie den DB-Verbindungspool mit Golang
Verwirklichen Sie den PHP / Python-Generator mit Golang / Ruby
Bash mit Golang anrufen
Betreiben Sie den Db2-Container mit Go
Stellen Sie das Verbindungszeitlimit mit boto3 ein
Erste Schritte mit PKI mit Golang ―― 4
UDP gleichzeitige Verbindung mit Python
Verbindungspooling mit Python + MySQL