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
を設定しないことをお勧めします。
Prisma Client を PgBouncer と共に使用するには、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 は、データベースの現在の状態とマイグレーションテーブルをチェックアウトするために、データベーストランザクションを使用します。ただし、Schema Engine はデータベースへの単一接続を使用するように設計されており、PgBouncer を使用した接続プーリングをサポートしていません。PgBouncer を接続プーリングに使用する環境で Prisma Migrate コマンドを実行しようとすると、次のエラーが表示される場合があります。
Error: undefined: Database error
Error querying the database: db error: ERROR: prepared statement "s0" already exists
この問題を回避するには、PgBouncer を経由せずにデータベースに直接接続する必要があります。これを実現するには、directUrl
フィールドを datasource
ブロックで使用できます。
たとえば、次の 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 をそれらでも動作するモードにすることができます。