PostgreSQL保持由Go建立的连接处于打开状态
使用Go cron包,我每秒运行以下代码:PostgreSQL保持由Go建立的连接处于打开状态,postgresql,go,database-connection,Postgresql,Go,Database Connection,使用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() f
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
会释放回池的连接。它故意保持打开状态,以便下次需要数据库时,应用程序不必等待新的连接握手,只需重新使用现有连接即可。这几乎就是连接池的定义。谢谢,很高兴知道这一点,但这可以调整吗?我将最大连接数设置为100,很快就不可能再建立新连接了。我知道我可以做db.SetMaxOpenConns(n)
有3种方法可以调整连接池:,这非常有用,谢谢。我可能会在2到3天内接受。如文档所述,这将关闭行迭代器,而不是数据库连接。