跳到主要內容

使用 PgBouncer 配置 Prisma Client

像是 PgBouncer 這樣的外部連線池工具,會持有一個到資料庫的連線池,並透過位於 Prisma Client 和資料庫之間來代理傳入的客戶端連線。這減少了資料庫在任何給定時間必須處理的進程數量。

通常,這會以透明方式運作,但有些連線池工具僅支援有限的功能集。外部連線池工具不支援的一個常見功能是具名的預備語句,而 Prisma ORM 會使用它。對於這些情況,可以將 Prisma ORM 配置為以不同的方式運作。

資訊

正在尋找簡單、無需基礎架構的解決方案嗎?試試 Prisma Accelerate!它幾乎不需要設定,並且可以與 Prisma ORM 支援的所有資料庫無縫協作。

準備開始了嗎?點擊即可開始使用 Prisma Accelerate.

PgBouncer

將 PgBouncer 設定為交易模式

為了讓 Prisma Client 可靠地運作,PgBouncer 必須以交易模式執行。

交易模式為每個交易提供一個連線 – 這是 Prisma Client 與 PgBouncer 協作的要求。

對於 1.21.0 以下的 PgBouncer 版本,新增 pgbouncer=true

警告

如果您使用的是 PgBouncer 1.21.0 或更高版本,我們建議**不要**在資料庫連線字串中設定 pgbouncer=true

若要將 Prisma Client 與 PgBouncer 一起使用,請將 ?pgbouncer=true 標記新增至 PostgreSQL 連線 URL

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 使用資料庫交易來檢查資料庫的目前狀態和 migrations 表。但是,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"
}

上面的區塊使用 PgBouncer 連線字串作為主要 URL (使用 url),讓 Prisma Client 可以利用 PgBouncer 連線池工具。

它也使用 directUrl 欄位提供直接連線到資料庫 (不透過 PgBouncer) 的連線字串。當調用需要單一資料庫連線的命令 (例如 prisma migrate devprisma db push) 時,將會使用此連線字串。

PgBouncer 與不同的資料庫供應商

有時,根據託管資料庫的供應商,直接連線到 Postgres 資料庫的方式會有些微差異。

以下連結提供關於如何設定與供應商的這些連線的資訊,這些供應商的設定步驟未在我們的文件中涵蓋

Supabase Supavisor

Supabase 的 Supavisor 行為與 PgBouncer 類似。您可以將 ?pgbouncer=true 新增到透過您的 Supabase 資料庫設定取得的連線池連線字串。

其他外部連線池工具

儘管 Prisma ORM 沒有明確支援其他連線池工具,但如果限制與 PgBouncer 的限制相似,您通常也可以在連線字串中使用 pgbouncer=true,讓 Prisma ORM 進入可與它們協作的模式。