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

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_statements0より大きい値に設定することで、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 devprisma db pushなど、データベースへの単一接続を必要とするコマンドが呼び出されたときに使用されます。

異なるデータベースプロバイダーとのPgBouncer

Postgresデータベースに直接接続する方法は、データベースをホストしているプロバイダーによって多少異なります。

以下は、このドキュメントでは説明されていない設定手順を持つプロバイダーとの接続設定方法に関する情報へのリンクです。

Supabase Supavisor

SupabaseのSupavisorはPgBouncerと似た動作をします。Supabaseのデータベース設定から利用できるコネクションプールされた接続文字列に?pgbouncer=trueを追加できます。

その他の外部コネクションプーラー

Prisma ORMは他のコネクションプーラーを明示的にサポートしていませんが、制限がPgBouncerのものと似ている場合は、接続文字列にpgbouncer=trueを使用することで、Prisma ORMをそれらとも連携するモードに設定できます。

© . All rights reserved.