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
将连接 释放回池 。它有意保持打开状态,以便下次需要您的数据库时,您的应用程序不必等待新的连接握手,它可以重新使用现有连接。这几乎就是连接池的定义。
使用 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
将连接 释放回池 。它有意保持打开状态,以便下次需要您的数据库时,您的应用程序不必等待新的连接握手,它可以重新使用现有连接。这几乎就是连接池的定义。