連線管理
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 會執行以下操作
- 執行
beforeExit
hook - 結束 Query Engine 子程序並關閉所有連線
在 GraphQL API 等長時間運行的應用程式中,它不斷地為請求提供服務,因此在每個請求後都 $disconnect()
是沒有意義的 - 建立連線需要時間,並且在每個請求中都這樣做會減慢您的應用程式速度。
為了避免在長時間運行的應用程式中產生過多連線,我們建議您在您的應用程式中使用單一 PrismaClient
實例。
明確呼叫 $disconnect()
您應該明確呼叫 $disconnect()
的一種情況是,當腳本
- 不頻繁執行(例如,每晚排程的電子郵件發送作業),這表示它不會從與資料庫的長時間運行連線中受益,而且
- 存在於長時間運行的應用程式的上下文中,例如背景服務。如果應用程式永遠不會關閉,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
實例都會建立新的連線池。
Exit hooks
從 Prisma ORM 5.0.0 開始,beforeExit
hook 僅適用於二進制 Query Engine。
當 Prisma ORM 被外部觸發(例如透過 SIGINT
訊號)關閉時,beforeExit
hook 會運行,並允許您在 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',
},
})
})