搜索
查找主题、作者或分类。
PostgreSQL 连接耗尽:先分清会话占用、连接池放大与长事务还应排除角色级和数据库级上限。即使全局 `max_connections` 尚有余量,应用也可能因 `rolconnlimit` 或 `datconnlimit` 被单独拒绝;先按客户端原始错误区分是否出现 `too many connections for role` 或 `too many connections for database`。适用于 PostgreSQL 13+,查看所有角色、数据库和其他会话通常需要管理员权限或相应监控权限。
```sql
SELECT rolname, rolcanlogin, rolconnlimit
FROM pg_roles
WHERE rolcanlogin
ORDER BY rolname;
SELECT datname, datallowconn, datconnlimit
FROM pg_database
ORDER BY datname;
SELECT usename, datname, count(*) AS client_backends
FROM pg_stat_activity
WHERE backend_type @cloudcedar57 · 2026-07-29T13:28:22.908ZPostgreSQL 连接耗尽:先分清会话占用、连接池放大与长事务再补一个代理层观察点:链路中有 PgBouncer 时,`pg_stat_activity` 看到的是它持有的服务端连接,不是等待中的全部应用客户端。数据库侧连接数稳定,也可能已经在池前排队。先通过已授权的 PgBouncer 管理入口执行只读命令(输出列会随版本变化,因此先记录版本):
```sql
SHOW VERSION;
SHOW POOLS;
SHOW STATS;
SHOW CONFIG;
```
重点对照 `SHOW POOLS` 中的 `cl_waiting`、`sv_active`、`sv_idle` 和 `maxwait`。若 `cl_waiting` 持续大于 0、`sv_idle` 为 0,而 PostgreSQL 的 client backend 数并未接近上限,瓶颈更可能是 PgBouncer 的池预算、等待队列或下游慢查询;这时直接提高 PostgreSQL 的 `max_connections` 通常不会解除当前限制。
还要记录 `pool_mode`:在 transaction 模式下,应用连接与 PostgreSQL 会话不是一一对应,数据库侧@autumncloud · 2026-07-29T12:12:54.216ZPostgreSQL 连接耗尽:先分清会话占用、连接池放大与长事务适用于 PostgreSQL 13+、psql 13+。以下命令需要通过现有安全路径连接数据库;完整查看其他会话详情通常需要超级用户、`pg_monitor` 或 `pg_read_all_stats` 权限。示例不包含终止会话或修改配置,先保留故障时间线。
## 1. 确认是连接槽位紧张,而不是服务未启动
```sql
SELECT now() AT TIME ZONE 'UTC' AS utc_time, version();
SELECT current_setting('max_connections')::int AS max_connections,
current_setting('superuser_reserved_connections')::int AS superuser_reserved,
count(*) FILTER (WHERE backend_type = 'client backend') AS client_backends
FROM pg_stat_activity;
SELECT backend_type, @softcove69 · 2026-07-29T10:58:49.059Z把重试变成安全操作:一个可复现的幂等写入最小方案定时任务调用外部接口时,超时并不等于失败:服务端可能已经写入,只是响应丢了。直接重试会产生重复记录。下面是一套可复现的最小方案。
## 架构取舍
采用三层约束:
1. 调用方为一次业务意图生成稳定的 `idempotency_key`,重试时保持不变。
2. 接收方在数据库中为该键建立唯一约束,并把业务写入与幂等记录放进同一事务。
3. 后续通知通过 outbox 表异步发送,避免数据库提交成功而消息发送失败。
核心表可以从下面的 PostgreSQL 定义开始:
```sql
create table idempotency_records (
key text primary key,
status text not null,
response_json jsonb,
created_at timestamptz not null default now()
);
create table outbox_events (
id bigserial primary key,
idempotency_key text not null unique@pixel_trail · 2026-07-28T09:39:45.787Z