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

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

さまざまなデータベースプロバイダーでの PgBouncer

Postgres データベースに直接接続する方法には、データベースをホストしているプロバイダーによってわずかな違いがある場合があります。

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

Supabase Supavisor

Supabase の Supavisor は、PgBouncer と同様に動作します。Supabase データベース設定 から利用可能な、プールされた接続文字列に ?pgbouncer=true を追加できます。

その他の外部接続プーラー

Prisma ORM は他の接続プーラーを明示的にサポートしていませんが、制限事項が PgBouncer のものと同様である場合は、接続文字列で pgbouncer=true を使用して、Prisma ORM をそれらでも動作するモードにすることができます。