連線管理
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 會
- 執行
beforeExit鉤子 - 結束查詢引擎子程序並關閉所有連線
在像 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 例項都會建立一個新的連線池。
退出鉤子
從 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',
},
})
})