跳到主要内容

配置 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 devprisma db push)时,将使用此连接字符串。

不同数据库提供商的 PgBouncer 配置

直接连接到 PostgreSQL 数据库的方式有时会因数据库托管提供商而异。

以下是关于如何与本文档未涵盖的提供商设置这些连接的信息链接

Supabase Supavisor

Supabase 的 Supavisor 行为类似于 PgBouncer。你可以将 ?pgbouncer=true 添加到通过 Supabase 数据库设置获得的连接池字符串中。

其他外部连接池

尽管 Prisma ORM 没有明确支持其他连接池,但如果限制与 PgBouncer 类似,你通常也可以在连接字符串中使用 pgbouncer=true,使 Prisma ORM 处于可与它们配合工作的模式。

© . All rights reserved.