跳至主要内容

连接管理

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 Client 会

  1. 运行beforeExit 钩子
  2. 结束查询引擎子进程并关闭所有连接

在持续服务请求的长期运行应用程序(例如 GraphQL API)中,在每次请求后调用 $disconnect() 没有意义 - 建立连接需要时间,并且在每次请求中这样做会降低应用程序的速度。

提示

为了避免在长期运行的应用程序中出现过多连接,我们建议您在整个应用程序中使用单个 PrismaClient 实例

显式调用 $disconnect()

您应该显式调用 $disconnect() 的一种情况是脚本

  1. **不经常**运行(例如,每晚发送电子邮件的计划作业),这意味着它不会从与数据库的长期运行连接中受益并且
  2. 存在于长期运行的应用程序的上下文中,例如后台服务。如果应用程序从未关闭,则 Prisma Client 永远不会断开连接。

以下脚本创建了一个新的 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 Client 断开连接之前运行代码 - 例如,在服务的优雅关闭过程中发出查询

const prisma = new PrismaClient()

prisma.$on('beforeExit', async () => {
console.log('beforeExit hook')
// PrismaClient still available
await prisma.message.create({
data: {
message: 'Shutting down server',
},
})
})