PgBouncerでPrisma Clientを構成する
PgBouncerのような外部コネクションプーラーは、データベースへのコネクションプールを保持し、Prisma Clientとデータベースの間に位置することで、着信クライアント接続をプロキシします。これにより、データベースが一度に処理しなければならないプロセスの数が削減されます。
通常、これは透過的に機能しますが、一部のコネクションプーラーは限られた機能セットのみをサポートしています。外部コネクションプーラーがサポートしない一般的な機能の1つは、Prisma ORMが使用する名前付きプリペアドステートメントです。これらのケースでは、Prisma ORMは異なる動作をするように構成できます。
簡単でインフラ不要のソリューションをお探しですか?Prisma Accelerateを試してみてください!ほとんど設定不要で、Prisma ORMがサポートするすべてのデータベースとシームレスに連携します。
始める準備はできましたか?Prisma Accelerateを開始するには、ここをクリックしてください。.
PgBouncer
PgBouncerをトランザクションモードに設定する
Prisma Clientが確実に動作するには、PgBouncerはトランザクションモードで実行する必要があります。
トランザクションモードは、トランザクションごとに接続を提供します。これは、Prisma ClientがPgBouncerと連携するために必要な要件です。
PgBouncerバージョン1.21.0
未満の場合、pgbouncer=true
を追加する
PgBouncer 1.21.0
以降を使用している場合は、データベース接続文字列にpgbouncer=true
を設定しないことをお勧めします。
PgBouncerでPrisma Clientを使用するには、PostgreSQL接続URLに?pgbouncer=true
フラグを追加します。
postgresql://USER:PASSWORD@HOST:PORT/DATABASE?pgbouncer=true
PgBouncerプーリング用に指定されたPORT
は、デフォルトの5432
ポートと異なる場合があります。正しいポート番号については、データベースプロバイダーのドキュメントを確認してください。
PgBouncerのmax_prepared_statements
をゼロより大きい値に設定する
Prismaはプリペアドステートメントを使用しており、max_prepared_statements
を0
より大きい値に設定することで、PgBouncerがこれらのプリペアドステートメントを使用できるようになります。
PgBouncerプーリング用に指定されたPORT
は、デフォルトの5432
ポートと異なる場合があります。正しいポート番号については、データベースプロバイダーのドキュメントを確認してください。
Prisma MigrateとPgBouncerの回避策
Prisma Migrateは、データベースの現在の状態とマイグレーションテーブルをチェックするためにデータベーストランザクションを使用します。しかし、スキーマエンジンはデータベースへの単一接続を使用するように設計されており、PgBouncerとのコネクションプーリングをサポートしていません。PgBouncerをコネクションプーリングに使用する環境でPrisma Migrateコマンドを実行しようとすると、以下のエラーが表示される可能性があります。
Error: undefined: Database error
Error querying the database: db error: ERROR: prepared statement "s0" already exists
この問題を回避するには、PgBouncerを介さずにデータベースに直接接続する必要があります。これを行うには、datasource
ブロックでdirectUrl
フィールドを使用できます。
例えば、以下のdatasource
ブロックを考慮してください。
datasource db {
provider = "postgresql"
url = "postgres://USER:PASSWORD@HOST:PORT/DATABASE?pgbouncer=true"
directUrl = "postgres://USER:PASSWORD@HOST:PORT/DATABASE"
}
上記のブロックは、url
を使用してPgBouncer接続文字列をプライマリURLとして使用しており、Prisma ClientがPgBouncerコネクションプーラーの利点を活用できるようにします。
また、directUrl
フィールドを使用して、PgBouncerを介さずにデータベースに直接接続する文字列も提供します。この接続文字列は、prisma migrate dev
やprisma db push
など、データベースへの単一接続を必要とするコマンドが呼び出されたときに使用されます。
異なるデータベースプロバイダーとのPgBouncer
Postgresデータベースに直接接続する方法は、データベースをホストしているプロバイダーによって多少異なります。
以下は、このドキュメントでは説明されていない設定手順を持つプロバイダーとの接続設定方法に関する情報へのリンクです。
Supabase Supavisor
SupabaseのSupavisorはPgBouncerと似た動作をします。Supabaseのデータベース設定から利用できるコネクションプールされた接続文字列に?pgbouncer=true
を追加できます。
その他の外部コネクションプーラー
Prisma ORMは他のコネクションプーラーを明示的にサポートしていませんが、制限がPgBouncerのものと似ている場合は、接続文字列にpgbouncer=true
を使用することで、Prisma ORMをそれらとも連携するモードに設定できます。