跳到主要內容

連線管理

PrismaClient 使用以下兩種方法連線和斷開資料來源

在大多數情況下,你**無需顯式呼叫這些方法**。PrismaClient 在你執行第一個查詢時自動連線,建立連線池,並在 Node.js 程序結束時斷開連線。

有關不同部署正規化(長時間執行的程序和無伺服器函式)的連線管理資訊,請參閱連線管理指南

$connect()

由於惰性連線行為,沒有必要呼叫$connect():當向 API 發出第一個請求時,PrismaClient 例項會進行惰性連線($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',
},
})
})
© . This site is unofficial and not affiliated with Prisma Data, Inc.