使用 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 dev
或 prisma db push
) 時,將會使用此連線字串。
PgBouncer 與不同的資料庫供應商
有時,根據託管資料庫的供應商,直接連線到 Postgres 資料庫的方式會有些微差異。
以下連結提供關於如何設定與供應商的這些連線的資訊,這些供應商的設定步驟未在我們的文件中涵蓋
Supabase Supavisor
Supabase 的 Supavisor 行為與 PgBouncer 類似。您可以將 ?pgbouncer=true
新增到透過您的 Supabase 資料庫設定取得的連線池連線字串。
其他外部連線池工具
儘管 Prisma ORM 沒有明確支援其他連線池工具,但如果限制與 PgBouncer 的限制相似,您通常也可以在連線字串中使用 pgbouncer=true
,讓 Prisma ORM 進入可與它們協作的模式。