You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:25:24