Next.jsでPrismaシングルトンパターン - ホットリロードの接続リークを解決

問題

Next.jsの開発モードでファイルを修正するたびにホットリロードが発生し、new PrismaClient()が毎回新しく実行されます。その結果、DB接続が蓄積され、Too many connectionsエラーが発生します。

解決方法

// lib/prisma.ts
import { PrismaClient } from '@prisma/client'

const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined
}

const prisma = globalForPrisma.prisma ?? new PrismaClient()

if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma

export default prisma

ポイント

  • globalThisはホットリロードしても初期化されません。ここにPrismaインスタンスを保存しておけば、ファイルが再読み込みされても既存の接続を再利用できます。
  • 本番環境ではモジュールは一度だけ読み込まれるため、globalThisへの保存は不要です。そのためNODE_ENV !== 'production'の条件を付けています。
  • たった5行のコードで、開発中にDB接続が数十個も溜まるのを防ぐことができます。