为什么 PostgreSQL 需要连接池?
每建立一个 PostgreSQL 数据库连接,都需要消耗一定的内存、CPU 和认证开销。当应用实例数量增加或并发请求较高时,如果每个请求都创建新的数据库连接,很容易超过 PostgreSQL 的 max_connections 限制,从而导致连接失败甚至数据库性能下降。连接池通过复用已有连接,减少频繁建立与销毁连接的成本,是生产环境的推荐方案。
核心概念
减少连接开销
数据库连接可重复利用,无需每个请求重新建立 TCP 与认证流程。
提高并发能力
限制数据库实际连接数量,同时支持更多业务请求。
降低资源占用
减少 PostgreSQL 后端进程数量,降低内存消耗。
提升稳定性
避免连接数耗尽导致应用无法访问数据库。
Prisma 默认连接池
Prisma Client 内置了连接池机制,在普通 Node.js 服务中通常已经能够满足大部分需求。但如果部署在 Serverless、Edge Runtime 或大量容器副本环境,每个实例都会维护自己的连接池,最终可能造成数据库连接数迅速增长,因此需要额外的连接代理。
import { PrismaClient } from '@prisma/client';
const globalForPrisma = globalThis as unknown as {
prisma?: PrismaClient;
};
export const prisma = globalForPrisma.prisma ?? new PrismaClient();
if (process.env.NODE_ENV !== 'production') {
globalForPrisma.prisma = prisma;
}PgBouncer 连接代理
PgBouncer 是 PostgreSQL 最常见的连接池代理。应用程序只需要连接 PgBouncer,而 PgBouncer 再统一管理与 PostgreSQL 的真实连接。这样即使有数百个应用实例,也只会维持少量数据库连接。
核心概念
Session
整个客户端会话独占一个数据库连接,兼容性最好。
Transaction
事务结束立即释放连接,性能最佳,也是生产环境最常见模式。
Statement
每条 SQL 使用独立连接,性能最高,但兼容性最差。
DATABASE_URL="postgresql://user:password@pgbouncer:6432/app"Prisma Accelerate
Prisma Accelerate 是官方提供的全球连接代理服务,特别适用于 Serverless、Vercel、Cloudflare Workers 等环境。除了连接池能力外,还支持查询缓存、全球节点加速以及自动连接管理,无需自行维护 PgBouncer。
核心概念
PgBouncer
自建部署、成本低、控制能力强,适合 VPS 与 Kubernetes。
Prisma Accelerate
官方托管,无需维护基础设施,适合 Serverless 和全球部署。
生产环境最佳实践
核心概念
单例 PrismaClient
整个应用仅创建一个 PrismaClient 实例。
启用连接代理
普通服务器推荐 PgBouncer,Serverless 推荐 Prisma Accelerate。
合理设置 max_connections
根据服务器内存与业务规模调整 PostgreSQL 参数。
监控连接状态
定期查看 pg_stat_activity,及时发现连接泄漏。
相关笔记
在数字化一期,此笔记未产生更深相关的共鸣分枝。