生产环境为什么会出问题?
Prisma 默认是“直连数据库”的,每个应用实例都会创建多个连接。当部署到 Serverless 或多容器环境时,连接数会迅速超过 PostgreSQL 限制,导致数据库崩溃或拒绝连接。
常见生产问题
连接数爆炸
多个实例同时创建 Prisma Client
Serverless 冷启动慢
每次请求初始化连接
数据库拒绝连接
超过 max_connections 限制
查询延迟上升
无连接池导致频繁建立连接
正确的 Prisma 单例模式
singleton.ts
typescript
import { PrismaClient } from '@prisma/client';
const globalForPrisma = globalThis as unknown as {
prisma?: PrismaClient;
};
export const prisma = globalForPrisma.prisma ?? new PrismaClient({
log: ['error', 'warn']
});
if (process.env.NODE_ENV !== 'production') {
globalForPrisma.prisma = prisma;
}这个模式可以避免开发环境热重载导致的重复连接,但在生产环境仍然不够,必须配合连接池。
PgBouncer 连接池(核心方案)
PgBouncer 是 PostgreSQL 的轻量级连接池代理,用于复用数据库连接,避免 Prisma 每个实例都建立独立连接。
PgBouncer 作用
连接复用
减少数据库连接创建成本
控制连接数
避免超过 max_connections
提升吞吐
减少连接切换开销
稳定系统
防止数据库被压垮
Prisma + PgBouncer 配置
.env
env
DATABASE_URL="postgresql://user:pass@pgbouncer:6432/dbname?pgbouncer=true"关键参数 pgbouncer=true 会让 Prisma 适配 PgBouncer 的 transaction pooling 模式。
Serverless 环境问题
Serverless 痛点
函数频繁启动
每次请求可能新建连接
连接数不可控
并发直接放大
冷启动延迟
初始化 Prisma Client
成本增加
数据库压力上升
推荐解决方案
生产级架构
PgBouncer
连接池代理(必须)
Prisma Accelerate
官方云连接池方案
单例 Prisma Client
避免重复初始化
容器化部署
Docker + CI/CD
Docker 部署建议
Dockerfile
dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npx prisma generate
CMD ["node", "dist/index.js"]CI/CD 必做步骤
部署流程
install dependencies
npm install
generate client
prisma generate
run migrations
prisma migrate deploy
start server
node dist
总结
Prisma 在生产环境的核心不是查询写法,而是连接管理。只要连接池设计正确,Prisma 可以稳定支撑高并发系统。
下一步学习
进入最终阶段
Prisma 最佳实践体系
架构总结 + 规范
企业级数据库设计
完整系统设计方法
相关笔记
在数字化一期,此笔记未产生更深相关的共鸣分枝。