メインコンテンツへスキップ

接続管理

`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は以下を行います

  1. beforeExitフックを実行する
  2. Query Engineの子プロセスを終了し、すべての接続を閉じる

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`フックはバイナリ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',
},
})
})
© 2025 prisma.dokyumento.jp. All rights reserved.