创建Prisma工具类时检查环境的原因及生产环境连接疑问
Prisma 单例连接工具类的生产环境行为疑问
问题背景
查看Prisma示例时,发现作者推荐创建工具类以避免每次导入时新建连接,给出的代码如下:
import { PrismaClient } from '@prisma/client'; export const prisma = global.prisma || new PrismaClient(); if (process.env.NODE_ENV !== 'production') { global.prisma = prisma; }
疑问:该代码在生产环境中是否会违背初衷,每次都新建连接?还是prisma变量在导入间会持久化,仅在非生产环境设为全局以减少导入操作?
解答
- 生产环境不会重复创建连接:Node.js的模块系统是单例机制,模块首次导入执行后,导出的内容会被自动缓存。不管项目里多少文件导入这个工具类,
prisma实例只会在第一次导入时初始化,后续导入直接复用缓存的实例,不会新建PrismaClient连接。 - 非生产环境用全局变量的原因:开发环境中,热重载工具(比如nodemon)会频繁重启应用、重新加载模块,如果不用全局变量缓存实例,每次热重载都会新建
PrismaClient,容易导致数据库连接池耗尽。而生产环境没有热重载场景,模块只会加载一次,不需要挂到全局对象上。 - 逻辑合理性:这段代码的设计完全贴合场景——生产环境靠模块缓存保证单例,开发环境靠全局变量规避热重载的问题,最终都能实现「只创建一个PrismaClient实例」的核心目标。
内容的提问来源于stack exchange,提问作者Guido
相关产品推荐
相关产品推荐

