连接管理
PrismaClient
使用以下两种方法连接和断开数据源的连接
在大多数情况下,您**不需要显式调用这些方法**。PrismaClient
会在您运行第一个查询时自动连接,创建一个连接池,并在 Node.js 进程结束时断开连接。
有关针对不同部署模式(长时间运行的进程和无服务器函数)管理连接的信息,请参阅连接管理指南。
$connect()
由于延迟连接行为,无需调用$connect()
:PrismaClient
实例将在向 API 发出第一个请求时延迟连接($connect()
会在幕后为您调用)。
显式调用 $connect()
如果您需要第一个请求立即响应,并且无法等待建立延迟连接,您可以显式调用 prisma.$connect()
以建立与数据源的连接
const prisma = new PrismaClient()
// run inside `async` function
await prisma.$connect()
$disconnect()
当您调用$disconnect()
时,Prisma 客户端将
- 运行
beforeExit
钩子 - 结束查询引擎子进程并关闭所有连接
在长时间运行的应用程序(例如持续处理请求的 GraphQL API)中,在每次请求后都调用 $disconnect()
没有意义 - 建立连接需要时间,并且在每次请求中执行此操作会减慢您的应用程序速度。
为了避免在长时间运行的应用程序中建立太多连接,建议您在整个应用程序中使用单个 PrismaClient
实例。
显式调用 $disconnect()
您应该显式调用 $disconnect()
的一种情况是,当脚本
- 不常运行(例如,每天晚上发送电子邮件的计划作业),这意味着它不会从与数据库的长时间运行的连接中获益,并且
- 存在于长时间运行的应用程序的上下文中,例如后台服务。如果应用程序从未关闭,则 Prisma 客户端永远不会断开连接。
以下脚本将创建一个新的 PrismaClient
实例,执行一项任务,然后断开连接 - 这将关闭连接池
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
const emailService = new EmailService()
async function main() {
const allUsers = await prisma.user.findMany()
const emails = allUsers.map((x) => x.email)
await emailService.send(emails, 'Hello!')
}
main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})
如果上述脚本在长时间运行的应用程序的上下文中多次运行而没有调用 $disconnect()
,则会为每个新的 PrismaClient
实例创建一个新的连接池。
退出钩子
从 Prisma ORM 5.0.0 开始,beforeExit
钩子仅适用于二进制查询引擎。
当 Prisma ORM 被外部触发(例如,通过 SIGINT
信号)关闭时,beforeExit
钩子会运行,并允许您在 Prisma 客户端断开连接之前运行代码 - 例如,在服务正常关闭时发出查询
const prisma = new PrismaClient()
prisma.$on('beforeExit', async () => {
console.log('beforeExit hook')
// PrismaClient still available
await prisma.message.create({
data: {
message: 'Shutting down server',
},
})
})