PostgreSQL сохраняет соединения, созданные Go, открытыми - PullRequest
0 голосов
/ 25 октября 2019

Используя пакет Go cron, я запускаю следующий код каждую секунду:

func dbPGConnectionCount(db *sql.DB) (int64, error) {
    var connectionCount int64
    rows, err := db.Query(`SELECT count(1) from pg_stat_activity;`)
    if err != nil {
        return 0, err
    }
    defer rows.Close()
    for rows.Next() {
        err = rows.Scan(&connectionCount)
        if err != nil {
            return 0, err
        }
    }
    return connectionCount, err
}

, где db - пул соединений для соединений с PostgreSQL.

Благодаря deferЗаявление Я ожидал, что PostgreSQL не будет держать открытыми какие-либо соединения. Однако вскоре после запуска моей программы, когда я проверяю с помощью select * from pg_stat_activity, я вижу новые пустые запросы, добавляемые каждую секунду.

Что я делаю не так?

1 Ответ

2 голосов
/ 25 октября 2019

Вы не делаете ничего плохого. Вот как работает пул соединений. Ваш defer освобождает соединение обратно в пул . Он намеренно остается открытым, поэтому в следующий раз, когда понадобится ваша база данных, вашему приложению не нужно ждать подтверждения нового соединения, оно может просто повторно использовать существующее соединение. Это в значительной степени определение пула соединений.

...