跳至主要内容

读取副本

读取副本允许您将工作负载分布到数据库副本中,以满足高流量工作负载的需求。该读取副本扩展@prisma/extension-read-replicas,为 Prisma Client 添加了对只读数据库副本的支持。

读取副本扩展支持 Prisma ORM 版本5.2.0及更高版本。如果您遇到错误或有任何反馈,请在此处创建 GitHub 问题这里

设置读取副本扩展

安装扩展

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查询都将针对您的主数据库执行。

如果您遇到错误或有任何反馈,请在此处创建 GitHub 问题这里

配置多个数据库副本

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(...)