配置 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 处于可与它们配合工作的模式。