如何用Golang统计Postgres当前打开连接数排查Lambda事务失败?
如何通过Golang统计Postgres当前打开的连接数
核心SQL查询逻辑
Postgres内置的pg_stat_activity视图可以获取所有数据库连接的状态,常用的统计语句:
- 统计活跃连接数(正在执行SQL的连接):
SELECT count(*) FROM pg_stat_activity WHERE state = 'active'; - 统计所有打开的连接数(包括空闲连接):
SELECT count(*) FROM pg_stat_activity;
排查连接上限时,优先看总连接数是否接近Postgres配置的max_connections值。
Golang代码实现
以下是用标准库database/sql结合Postgres驱动的示例代码,用于查询并记录连接数:
package main import ( "database/sql" "fmt" "log" "os" _ "github.com/lib/pq" ) func getCurrentConnectionCount(db *sql.DB) (int, error) { var count int // 可替换为你需要的统计SQL query := "SELECT count(*) FROM pg_stat_activity;" err := db.QueryRow(query).Scan(&count) if err != nil { return 0, fmt.Errorf("查询连接数失败: %w", err) } return count, nil } func main() { // 从环境变量或配置文件读取数据库连接串 connStr := os.Getenv("DATABASE_URL") db, err := sql.Open("postgres", connStr) if err != nil { log.Fatalf("初始化数据库连接失败: %v", err) } defer db.Close() // 验证连接有效性 if err := db.Ping(); err != nil { log.Fatalf("数据库连接校验失败: %v", err) } count, err := getCurrentConnectionCount(db) if err != nil { log.Fatalf("获取连接数失败: %v", err) } // 记录连接数,Lambda场景建议写入CloudWatch日志 log.Printf("当前Postgres打开的连接数: %d", count) // 同时查询max_connections配置,对比是否接近上限 var maxConnections int err = db.QueryRow("SHOW max_connections").Scan(&maxConnections) if err != nil { log.Printf("获取max_connections配置失败: %v", err) } else { log.Printf("Postgres最大连接数配置: %d", maxConnections) log.Printf("连接使用率: %.2f%%", float64(count)/float64(maxConnections)*100) } }
Lambda场景下的注意事项
- 合理配置Lambda中的数据库连接池大小,根据Lambda并发数调整,避免无限制创建连接打满Postgres上限。
- 可以在连接失败时触发连接数统计,或者配合CloudWatch Events定时执行统计,方便捕捉峰值时的连接情况。
- 关于你遇到的
pq: PAM authentication failed for user "username"报错:虽然表面是认证问题,但Postgres连接数达上限时,部分驱动会抛出这类误导性报错,建议先确认连接数是否接近max_connections值。
内容的提问来源于stack exchange,提问作者madhu nandan
相关产品推荐
相关产品推荐

