examples/prisma-connection-pool-exhaustion/SKILL.md
Fix Prisma Too many connections and connection pool exhaustion errors in serverless environments (Vercel, AWS Lambda, Netlify). Use when: (1) Error P2024 Timed out fetching a new connection from the pool, (2) PostgreSQL too many connections for role, (3) Database works locally but fails in production serverless, (4) Intermittent database timeouts under load.
npx skillsauth add abhattacherjee/claudeception prisma-connection-pool-exhaustionInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Serverless functions create a new Prisma client instance on each cold start. Each instance opens multiple database connections (default: 5 per instance). With many concurrent requests, this quickly exhausts the database's connection limit (often 20-100 for managed databases).
This skill applies when you see:
P2024: Timed out fetching a new connection from the connection poolFATAL: too many connections for role "username"Too many connectionsnpm run dev but fails in productionEnvironment indicators:
The recommended solution is to use a connection pooler like PgBouncer or Prisma Accelerate, which sits between your serverless functions and the database.
For Supabase:
# .env
# Use the pooled connection string (port 6543, not 5432)
DATABASE_URL="postgresql://user:[email protected]:6543/postgres?pgbouncer=true"
For Neon:
# .env
DATABASE_URL="postgresql://user:[email protected]/dbname?sslmode=require"
# Neon has built-in pooling
For Prisma Accelerate:
npx prisma generate --accelerate
In your schema.prisma:
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
// Limit connections per Prisma instance
relationMode = "prisma"
}
In your connection URL or Prisma client:
// lib/prisma.ts
import { PrismaClient } from '@prisma/client'
const globalForPrisma = global as unknown as { prisma: PrismaClient }
export const prisma = globalForPrisma.prisma || new PrismaClient({
datasources: {
db: {
url: process.env.DATABASE_URL + '?connection_limit=1'
}
}
})
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
Prevent hot-reload from creating new clients:
// lib/prisma.ts
import { PrismaClient } from '@prisma/client'
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined
}
export const prisma = globalForPrisma.prisma ?? new PrismaClient()
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
Add these to your connection string:
?connection_limit=1&pool_timeout=20&connect_timeout=10
connection_limit=1: One connection per serverless instancepool_timeout=20: Wait up to 20s for available connectionconnect_timeout=10: Fail fast if can't connect in 10sAfter applying fixes:
npx autocannon -c 100 -d 30 https://your-app.com/api/testBefore (error under load):
[ERROR] PrismaClientKnownRequestError:
Invalid `prisma.user.findMany()` invocation:
Timed out fetching a new connection from the connection pool.
After (with connection pooling):
# Using Supabase pooler URL
DATABASE_URL="postgresql://[email protected]:6543/postgres?pgbouncer=true&connection_limit=1"
Database connections stable at 10-15 even under heavy load.
connection_limit=1 is aggressive; start there and increase if you see latencydevelopment
Detect and resolve TypeScript/JavaScript circular import dependencies. Use when: (1) Cannot access X before initialization at runtime, (2) Import returns undefined unexpectedly, (3) ReferenceError Cannot access X before initialization, (4) Type errors that disappear when you change import order, (5) Jest/Vitest tests fail with undefined imports that work in browser.
tools
Debug getServerSideProps and getStaticProps errors in Next.js. Use when: (1) Page shows generic error but browser console is empty, (2) API routes return 500 with no details, (3) Server-side code fails silently, (4) Error only occurs on refresh not client navigation. Check terminal/server logs instead of browser for actual error messages.
development
Extracts reusable knowledge from work sessions and codifies it into Claude Code skills. Use when: (1) /claudeception command to review session learnings, (2) save this as a skill or extract a skill from this, (3) what did we learn?, (4) after non-obvious debugging, workarounds, or trial-and-error discovery. Evaluates whether current work contains extractable knowledge, checks for existing skills, and creates or updates skills following the skill-authoring best practices.
devops
Local text-to-speech via sherpa-onnx (offline, no cloud)