配置 Prisma Client 與 PgBouncer
像 PgBouncer 這樣的外部連線池會維護一個到資料庫的連線池,並透過位於 Prisma Client 和資料庫之間來代理傳入的客戶端連線。這減少了資料庫在任何給定時間需要處理的程序數量。
通常情況下,這是透明工作的,但有些連線池只支援有限的功能集。外部連線池不支援的一個常見功能是命名預處理語句,而 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。為此,你可以在 datasource 塊中使用 directUrl 欄位。
例如,考慮以下 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 配置
直接連線到 PostgreSQL 資料庫的方式有時會因資料庫託管提供商而異。
以下是關於如何與本文件未涵蓋的提供商設定這些連線的資訊連結
Supabase Supavisor
Supabase 的 Supavisor 行為類似於 PgBouncer。你可以將 ?pgbouncer=true 新增到透過 Supabase 資料庫設定獲得的連線池字串中。
其他外部連線池
儘管 Prisma ORM 沒有明確支援其他連線池,但如果限制與 PgBouncer 類似,你通常也可以在連線字串中使用 pgbouncer=true,使 Prisma ORM 處於可與它們配合工作的模式。