跳到主要内容

读取副本

读取副本使你能够将工作负载分散到数据库副本中,以处理高流量工作负载。读取副本扩展@prisma/extension-read-replicas,为 Prisma Client 增加了只读数据库副本支持。

读取副本扩展支持 Prisma ORM 5.2.0 及更高版本。如果你遇到 Bug 或有反馈,请在此创建 GitHub issue。

设置读取副本扩展

安装扩展

npm install @prisma/extension-read-replicas

通过扩展你的 Prisma Client 实例来初始化扩展,并在扩展的 url 选项中提供指向你的读取副本的连接字符串。

import { PrismaClient } from '@prisma/client'
import { readReplicas } from '@prisma/extension-read-replicas'

const prisma = new PrismaClient().$extends(
readReplicas({
url: process.env.DATABASE_URL_REPLICA,
})
)

// Query is run against the database replica
await prisma.post.findMany()

// Query is run against the primary database
await prisma.post.create({
data: {/** */},
})

通过上述设置,所有读取操作(例如 findMany)都将针对数据库副本执行。所有写入操作(例如 createupdate)和 $transaction 查询都将针对你的主数据库执行。

如果你遇到 Bug 或有反馈,请在此创建 GitHub issue。

配置多个数据库副本

url 属性也接受一个数组值,即所有你希望配置的数据库副本的数组

const prisma = new PrismaClient().$extends(
readReplicas({
url: [
process.env.DATABASE_URL_REPLICA_1,
process.env.DATABASE_URL_REPLICA_2,
],
})
)

如果你配置了多个读取副本,将随机选择一个数据库副本来执行你的查询。

针对主数据库执行读取操作

你可以使用 $primary() 方法明确地针对你的主数据库执行读取操作

const posts = await prisma.$primary().post.findMany()

针对数据库副本执行操作

你可以使用 $replica() 方法明确地针对副本而非主数据库执行查询

const result = await prisma.$replica().user.findFirst(...)
© . All rights reserved.