关于 db-connection-pooling
用于检查数据库连接池配置风险的技能,重点识别可能导致连接耗尽的问题,涵盖无服务器环境直连 Postgres、事务池兼容性和连接池大小。
主要功能
- 01检测无服务器环境直连 Postgres
- 02检查事务池与会话功能冲突
- 03评估连接池与连接上限
- 04提供 Postgres 验证查询
适用场景
- 01审查无服务器数据库连接配置
- 02排查事务池中的预处理语句使用
- 03核对连接池及实例数是否超过后端上限
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ hainrixz/ claude-db --skill db-connection-pooling安装后在 Claude Code 中输入/db-connection-pooling确认已加载。
详细介绍
db-connection-pooling (M15)
连接耗尽是导致生产环境中断的主要原因之一,完全属于 性能与扩展性(轴
performance)范畴。它为关系型数据库的 连接池 w10(以及每个 NoSQL 配置中的 连接 类别)提供信息。如今最常见的故障是无服务器函数各自打开一个直连,导致后端过载。
检查内容
- 无服务器 + 直连 Postgres — 函数/边缘运行时(Vercel/Lambda/Cloudflare/Netlify)在没有连接池的情况下直接连接 Postgres。每次冷启动都会打开一个连接;并发量激增时会超过
max_connections。建议使用事务模式连接池或无服务器驱动(Neon/@neondatabase/serverless、Supabase 连接池、PlanetScale HTTP)。 - 误用事务模式连接池 — 使用事务池化端点(PgBouncer
transaction模式、Supabase 端口 6543),同时依赖该模式会破坏的会话功能:服务端预处理语句、SET/会话 GUC、LISTEN/NOTIFY、会话级 advisory 锁。 - 连接池大小 — 应用连接池
max× 实例数量超过后端max_connections,或者连接池过小,导致请求串行处理。
容量规划
- 服务端连接上限大致是 vCPU 数量的较小倍数,而非峰值并发数。将
(cores*2) + effective_spindles视为服务端可高效处理负载的后端连接上限,而非每个应用连接池的目标值。 - 客户端连接池的大小应设为该上限,而非峰值请求并发数。后端连接数超过服务器的有效处理能力,只会增加上下文切换和锁争用;应在连接池排队,而不是在数据库排队。
- 在
max_connections以下预留余量 — 保留superuser_reserved_connections(并为其他应用/复制留出空间),确保连接池饱和时管理员仍能连接。 - PgBouncer 事务模式会将许多客户端连接复用到少量后端连接上,因此客户端连接池可以远超后端上限 — 但该模式会破坏会话级功能(服务端预处理语句、
SET/会话 GUC、LISTEN/NOTIFY、会话范围的 advisory 锁)。
评分/轴
仅影响 性能(关系型数据库的 连接池 w10;NoSQL 配置中的 连接/连接池)。
Tier-0(静态)
检测运行时(依据 references/detection-signals.md 中的无服务器标记)以及客户端/驱动(pg、postgres、@neondatabase/serverless、@prisma/client、连接 URL 主机/端口)。标记来自无服务器环境的直连、与预处理语句用法同时出现的端口 6543/pgbouncer=true URL,以及连接池配置。后端 max_connections 和实时连接数属于运行时信息 → Tier-0 阶段为 needs_api。
Tier-1(验证查询,Postgres)
SELECT current_setting('max_connections') AS max_conn,
count(*) AS open_conns,
count(*) FILTER (WHERE state = 'idle') AS idle
FROM pg_stat_activity;
方法 connection_introspect。open_conns 接近 max_conn 时,确认连接耗尽问题,状态为 established。无服务器直连和连接池模式问题仅凭配置即可确认(directional);其在负载下的影响需要 Tier-2 验证,若无 Tier-2 则为 needs_api。
问题项
依据 schema/finding.schema.json 输出问题项。示例:
M15.app.serverless_direct_pg— 无服务器函数直接连接 Postgres,未使用连接池(severity:4、warn、轴performance、置信度directional、fixable: proposed— 改用连接池/无服务器驱动)。M15.app.prepared_stmt_on_txn_pooler— 通过事务模式连接池使用服务端预处理语句(severity:3、warn、directional、fixable: proposed)。M15.app.pool_exceeds_max_connections— 连接池 × 实例数量 > 后端最大连接数(severity:3、warn、Tier-1 为established/directional、fixable: proposed)。
每个问题项:evidence.observed 应逐字引用连接配置/驱动导入语句,并隐去凭据;verification.reproduce 应为上述引用 $DATABASE_URL 的目录查询;expected_impact 应标注区间和置信度(不得只给出百分比)。
诚实
- 配置合理的连接池后,长时间运行的服务(单个 Node/Rails 进程)使用直连没问题——无服务器直连的结论仅适用于按调用运行时。
- 绝不要引用无法观测到的连接数或故障概率;影响仅按区间划分,耗尽相关结论必须有 Tier-1/2 支持才能标记为
established。 - 此处的所有修复都属于配置/架构调整 →
proposed/advisory,绝不会是auto。