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.
Cloud: GCP WEB-Server Vue / CloudRun Golang / CloudRun API-Server DB-Server MySQL / CloudSQL
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.
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