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

如何通过pg_stat_activity识别node pg-postgres到PostgreSQL的连接归属

结论

完全可以通过node-postgres(pg库)实现连接来源的识别,核心是利用PostgreSQL内置的application_name配置项,将连接所属的后端API标识同步到pg_stat_activity视图中。

具体实现步骤

1. 配置连接标识

根据你使用的连接类型,在初始化时配置application_name参数,值可以自定义为对应API服务的唯一标识,比如api:user-service、api:order-service。

  • 单个Client连接配置示例:
const { Client } = require('pg');
const client = new Client({
  host: 'pg实例地址',
  port: 5432,
  user: '数据库账号',
  password: '数据库密码',
  database: '业务库名',
  // 核心配置:标记当前连接所属的API服务
  application_name: 'api:user-service'
});
  • Pool连接池配置示例(适合单API服务共用一个连接池的场景,池内所有连接会自动继承该标识):
const { Pool } = require('pg');
const pool = new Pool({
  // 其余基础连接配置省略
  application_name: 'api:order-service'
});

2. 细粒度标识配置(可选)

如果需要区分同一API服务下的不同请求场景,可在每次从连接池取到连接后动态修改标识,归还前重置即可:

const client = await pool.connect();
try {
  // 动态设置标识,可拼接请求ID、接口路径等信息,最大长度64字节
  await client.query(`SET application_name = 'api:user-service:get-user:req-123456'`);
  // 执行业务SQL
  const res = await client.query('SELECT * FROM users WHERE id = $1', [1]);
} finally {
  // 归还连接前重置标识,避免污染其他连接的使用
  await client.query(`SET application_name = 'api:user-service'`);
  client.release();
}
排查连接使用的查询语句

配置完成后,执行以下SQL即可从pg_stat_activity视图中直接看到每个连接对应的API来源:

SELECT 
  pid, 
  application_name, 
  state, 
  query, 
  backend_start, 
  query_start 
FROM pg_stat_activity
WHERE datname = '你的业务库名'
-- 排查活跃连接时保留该条件,排查连接泄漏时可去掉查看所有连接
AND state = 'active';

查询结果中的application_name字段即为你配置的API服务标识,可直接对应到持有连接的后端服务。

注意事项
  • application_name的最大长度为64字节,超出部分会被PostgreSQL自动截断,标识尽量简洁
  • 使用连接池时,动态修改标识后必须在归还连接前重置,避免后续复用该连接的请求标识错误
  • 排查连接泄漏场景时,可去掉state = 'active'过滤条件,结合backend_start字段查看连接的存活时长,定位长时间持有未释放的连接所属服务

内容的提问来源于stack exchange,提问作者Jan Ahlberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:06:06