接続管理
PrismaClient
は、次の2つのメソッドを使用してデータソースに接続および切断します。
ほとんどの場合、これらのメソッドを明示的に呼び出す必要はありません。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
フックを実行します- Query Engineの子プロセスを終了し、すべての接続を閉じます
GraphQL APIのような、リクエストを常に処理する長時間実行アプリケーションでは、リクエストごとに$disconnect()
を呼び出すのは意味がありません。接続を確立するのに時間がかかり、リクエストの一部としてそれを行うとアプリケーションが遅くなります。
長時間実行アプリケーションで多数の接続を避けるために、アプリケーション全体でPrismaClient
の単一インスタンスを使用することをお勧めします。
$disconnect()
の明示的な呼び出し
$disconnect()
を明示的に呼び出す必要があるシナリオの1つは、スクリプトが
- 頻繁に実行されない(たとえば、毎晩メールを送信するスケジュールされたジョブ)、つまりデータベースへの長時間実行接続の恩恵を受けないかつ
- バックグラウンドサービスなどの長時間実行アプリケーションのコンテキストに存在します。アプリケーションがシャットダウンしない場合、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
フックはバイナリQuery Engineにのみ適用されます。
beforeExit
フックは、Prisma ORMが外部から(例えば、SIGINT
シグナルを介して)シャットダウンするようにトリガーされたときに実行され、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',
},
})
})