SuperAPI AI 工具集

prisma-connection-pool-exhaustion

部署与运维

查看项目

更新于 10-15 20:07

技能介绍

用途:解决 Serverless 环境下 Prisma 连接池耗尽问题。Serverless 函数每次冷启动都会新建 Prisma 客户端实例,每个实例默认打开 5 个数据库连接,并发请求多时会超出托管数据库的连接上限(常见 20-100)。

触发条件:出现 P2024(Timed out fetching a new connection from the connection pool)、PostgreSQL 的 FATAL: too many connections for role、MySQL 的 Too many connections;本地 npm run dev 正常但生产失败;流量高峰报错后自行恢复;数据库面板连接数接近上限。

主要能力与用法:

  1. 使用连接池服务,如 PgBouncer 或 Prisma Accelerate。Supabase 使用池化连接串(端口 6543 而非 5432):DATABASE_URL="postgresql://user:pass@db.xxx.supabase.co:6543/postgres?pgbouncer=true";Neon 自带池化;Prisma Accelerate 执行 npx prisma generate --accelerate。
  2. 配置连接限制,在 Prisma 客户端中为 URL 追加 ?connection_limit=1。
  3. 开发环境用单例模式避免热重载重复创建客户端。
  4. URL 参数:?connection_limit=1&pool_timeout=20&connect_timeout=10。

验证:部署后运行 npx autocannon -c 100 -d 30 https://your-app.com/api/test,检查数据库连接数是否在限内、日志中不再出现 P2024。

限制:不同托管数据库池化方案不同,需查阅各自文档;PlanetScale(MySQL)架构不同,不存在该问题;connection_limit=1 较激进,出现延迟可调高;单例模式仅对开发有效,生产 Serverless 实例相互隔离;Next.js API 路由每次调用可能都是独立函数。