agentleFS
HainrixzHainrixz/claude-db/skills/db-connection-pooling/SKILL.md

db-connection-pooling

Skill22 starsChanged 5 months agoMITView on GitHub

Audit connection management — serverless functions opening direct Postgres connections, transaction-mode pooler misuse (PgBouncer / Supabase / prepared statements), and pool sizing against backend max_connections. Module M15. Feeds the Performance & Scale score.

The file

We split this skill into the rules it gives an agent

2 rules. About 0 are common, 0 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Never quote a connection count or an outage probability you cannot observe.

    line 84
  2. Very specific:

    All fixes here are config/architecture → proposed/advisory, never auto.

    line 86

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md
<!-- Copyright (c) 2026 Enrique Rocha (@soyenriquerocha) · tododeia.com · id er-f37b7121 -->

db-connection-pooling (M15)

Connection exhaustion is a top cause of production outages and a pure Performance & Scale (axis performance) concern. Feeds relational Pooling w10 (and the Conexión category in every NoSQL profile). The dominant modern failure is serverless functions opening one direct connection each and saturating the backend.

What it checks

  1. Serverless + direct Postgres — a function/edge runtime (Vercel/Lambda/Cloudflare/Netlify) connecting directly to Postgres with no pooler. Each cold start opens a connection; concurrency spikes blow past max_connections. Recommend a transaction-mode pooler or a serverless driver (Neon/@neondatabase/serverless, Supabase pooler, PlanetScale HTTP).
  2. Transaction-mode pooler misuse — using a transaction-pooling endpoint (PgBouncer transaction mode, Supabase port 6543) while relying on session features it breaks: server-side prepared statements, SET/session GUCs, LISTEN/NOTIFY, advisory-session locks.
  3. Pool sizing — application pool max × instance count exceeding backend max_connections, or a pool so small it serializes requests.

Sizing block

  • The server-connection ceiling is roughly a small multiple of vCPU, not your peak concurrency. Frame (cores*2) + effective_spindles as the server-side ceiling on usefully-busy backend connections — not a per-app-pool target.
  • Size the client pool to that ceiling, not to peak request concurrency. More backend connections than the server can usefully run just adds context-switch and lock contention; queue at the pool, not the database.
  • Reserve headroom below max_connections — leave superuser_reserved_connections (and room for other apps/replication) free so an admin can still connect when the pool saturates.
  • PgBouncer transaction mode multiplexes many client connections onto a few backend connections, so the client pool can far exceed the backend ceiling — but session-level features break under it (server-side prepared statements, SET/session GUCs, LISTEN/NOTIFY, session-scoped advisory locks).

Score / axis

Feeds performance only (relational Pooling w10; Conexión/Pooling in NoSQL profiles).

Tier-0 (static)

Detect the runtime (serverless markers per references/detection-signals.md) and the client/driver (pg, postgres, @neondatabase/serverless, @prisma/client, connection URL host/port). Flag direct connections from serverless, port-6543/pgbouncer=true URLs combined with prepared-statement usage, and pool config. Backend max_connections and live connection counts are runtime → needs_api at Tier-0.

Tier-1 (verification query, Postgres)

SELECT current_setting('max_connections') AS max_conn,
       count(*) AS open_conns,
       count(*) FILTER (WHERE state = 'idle') AS idle
FROM pg_stat_activity;

Method connection_introspect. open_conns approaching max_conn confirms an exhaustion finding as established. The serverless-direct and pooler-mode findings are confirmable from config alone (directional); their impact under load is needs_api without Tier-2.

Findings

Emit findings per schema/finding.schema.json. Examples:

  • M15.app.serverless_direct_pg — serverless function with a direct Postgres connection, no pooler (severity:4, warn, axis performance, confidence directional, fixable: proposed — switch to pooler/serverless driver).
  • M15.app.prepared_stmt_on_txn_pooler — server-side prepared statements over a transaction-mode pooler (severity:3, warn, directional, fixable: proposed).
  • M15.app.pool_exceeds_max_connections — pool × instances > backend max (severity:3, warn, established Tier-1 / directional, fixable: proposed).

Each finding: evidence.observed quotes the connection config / driver import verbatim with the credential redacted; verification.reproduce is the catalog query above referencing $DATABASE_URL; expected_impact is banded + confidence-tagged (no naked %).

Honesty

  • A long-lived server (a single Node/Rails process) with a sane pool is fine with a direct connection — the serverless-direct finding applies only to per-invocation runtimes.
  • Never quote a connection count or an outage probability you cannot observe; impact is banded only, and exhaustion claims need Tier-1/2 to become established.
  • All fixes here are config/architecture → proposed/advisory, never auto.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.