PostgreSQL 保持 Go 建立的连接打开

PostgreSQL keeps connections made by Go open

使用 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 时,我发现每秒都会添加新的空闲查询。

我做错了什么?

你没有做错任何事。这就是连接池的工作原理。您的 defer 将连接 释放回池 。它有意保持打开状态,以便下次需要您的数据库时,您的应用程序不必等待新的连接握手,它可以重新使用现有连接。这几乎就是连接池的定义。