Trên serverless mỗi request có thể spin một function instance riêng. Nếu mỗi instance mở một TCP connection trực tiếp tới Postgres, lúc traffic cao bạn cạn max_connections (Postgres thường chỉ ~100) → lỗi 'too many connections'.
Hình dung: mỗi function là một người mới bốc máy gọi điện; database chỉ có vài đường dây — gọi đồng loạt là nghẽn.
Cách xử lý:
- Dùng connection pooler đứng giữa: PgBouncer, Neon pooled endpoint, Supabase Pooler, Prisma Accelerate. App nối tới pooler, pooler tái sử dụng số connection thật ít ỏi.
- Driver serverless dùng HTTP/WebSocket thay vì TCP dài hạn: vd @neondatabase/serverless, Drizzle Neon adapter — mỗi query là một HTTP call, không giữ socket.
// Drizzle + Neon serverless (HTTP, không giữ TCP)
import { neon } from '@neondatabase/serverless'
import { drizzle } from 'drizzle-orm/neon-http'
export const db = drizzle(neon(process.env.DATABASE_URL!))Lưu ý: Prisma với pooler cần ?pgbouncer=true (tắt prepared statements) và một URL DIRECT_URL riêng cho migration.
Đừng tạo new PrismaClient() mỗi request — cache global trong dev để tránh rò connection.