You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js部署Vercel生产环境Prisma触发max_user_connections错误

Next.js部署Vercel生产环境时Prisma连接数耗尽问题

开发环境运行正常,仅创建1个数据库连接;但部署到Vercel生产环境后,立即触发数据库最大连接数限制(当前设置为5),导致API请求返回500错误,且错误发生后应用持续每秒发送GET请求,均失败。

当前Prisma客户端代码

client.js:

import { PrismaClient } from "./generators/app";

export const prisma =
  global.prisma ||
  new PrismaClient();

if (process.env.NODE_ENV !== 'production') global.prisma = prisma;

API文件导入方式:

import { prisma } from "../../../prisma/client";

错误日志

2022-10-27T20:58:32.492Z    07594f4a-727a-4e98-a4aa-264d060dc08b ERROR  PrismaClientInitializationError: 
Invalid `prisma.user.findUnique()` invocation:
Error querying the database: Server error: `ERROR 42000 (1226): User 'xxx' has exceeded the 'max_user_connections' resource (current value: 5)'
    at RequestHandler.handleRequestError (/var/task/.next/server/chunks/7738.js:31215:19)
    at RequestHandler.request (/var/task/.next/server/chunks/7738.js:31188:18)
    at async PrismaClient._request (/var/task/.next/server/chunks/7738.js:32176:24)
    at async havePermission (/var/task/.next/server/chunks/3433.js:49:40)
    at async getServerData (/var/task/.next/server/pages/api/app/user/get/[column].js:181:34)
    at async Object.apiResolver (/var/task/node_modules/next/dist/server/api-utils/node.js:366:9)
    at async NextNodeServer.runApi (/var/task/node_modules/next/dist/server/next-server.js:469:9)
    at async Object.fn (/var/task/node_modules/next/dist/server/next-server.js:719:37)
    at async Router.execute (/var/task/node_modules/next/dist/server/router.js:247:36)
    at async NextNodeServer.run (/var/task/node_modules/next/dist/server/base-server.js:346:29) {
  clientVersion: '4.3.1',
  errorCode: undefined
}
2022-10-27T20:58:32.501Z    07594f4a-727a-4e98-a4aa-260d060dc08b    ERROR   PrismaClientInitializationError: 
Invalid `prisma.user.findUnique()` invocation:
Error querying the database: Server error: `ERROR 42000 (1226): User 'xxx' has exceeded the 'max_user_connections' resource (current value: 5)'
    at RequestHandler.handleRequestError (/var/task/.next/server/chunks/7738.js:31215:19)
    at RequestHandler.request (/var/task/.next/server/chunks/7738.js:31188:18)
    at async PrismaClient._request (/var/task/.next/server/chunks/7738.js:32176:24)
    at async havePermission (/var/task/.next/server/chunks/3433.js:49:40)
    at async getServerData (/var/task/.next/server/pages/api/app/user/get/[column].js:181:34)
    at async Object.apiResolver (/var/task/node_modules/next/dist/server/api-utils/node.js:366:9)
    at async NextNodeServer.runApi (/var/task/node_modules/next/dist/server/next-server.js:469:9)
    at async Object.fn (/var/task/node_modules/next/dist/server/next-server.js:719:37)
    at async Router.execute (/var/task/node_modules/next/dist/server/router.js:247:36)
    at async NextNodeServer.run (/var/task/node_modules/next/dist/server/base-server.js:346:29) {
  clientVersion: '4.3.1',
  errorCode: undefined
}
RequestId: 07594f4a-727a-4e98-a4aa-264d060dc08b Error: Runtime exited with error: exit status 1
Runtime.ExitError

问题原因

Vercel的Serverless函数是请求触发式,每次请求可能启动独立运行实例。你当前的代码仅在非生产环境将Prisma实例挂载到global对象,生产环境下每个请求都会创建新的PrismaClient实例,每个实例占用数据库连接,并发请求数超过数据库最大连接数时就会触发错误。

修复方案

1. 修改Prisma客户端初始化代码

调整client.js,在生产环境也将Prisma实例挂载到global对象,确保每个运行实例只创建一个PrismaClient:

import { PrismaClient } from "./generators/app";

const prisma = global.prisma || new PrismaClient();

// 生产环境也挂载到global,复用实例
if (process.env.NODE_ENV !== 'development') global.prisma = prisma;

export default prisma;

2. 限制Prisma连接池大小

在schema.prisma中配置连接池大小,避免单个实例占用过多连接:

datasource db {
  provider = "mysql" // 替换为你使用的数据库类型
  url      = env("DATABASE_URL")
  pool_size = 2 // 根据数据库最大连接数调整,比如总连接数5时,每个实例设为2
}

3. 修复重复请求逻辑

排查前端代码,取消错误发生后每秒发送请求的逻辑,避免进一步加剧连接耗尽问题。

内容的提问来源于stack exchange,提问作者Angel Luis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:30:59