Prisma Accelerate 入门
先决条件
要开始使用 Accelerate,您需要具备以下条件:
- 一、
- 一个使用 Prisma Client
4.16.1或更高版本的项目。如果您的项目正在使用交互式事务,则需要使用5.1.1或更高版本。(我们始终建议使用最新版本的 Prisma。) - 托管的 PostgreSQL、MySQL/MariaDB、PlanetScale、CockroachDB 或 MongoDB 数据库
1. 启用 Accelerate
导航到您的 Prisma Data Platform 项目,选择一个环境,然后通过提供数据库连接字符串并选择离您的数据库最近的区域来启用 Accelerate。
如果您需要 IP 白名单或使用受信任 IP 地址的防火墙配置,请启用静态 IP 以增强安全性。了解更多关于 如何在平台控制台中为 Accelerate 启用静态 IP。
2. 将 Accelerate 添加到您的应用程序
2.1. 更新您的数据库连接字符串
启用后,系统会提示您生成一个 API 密钥,您将在新的 Accelerate 连接字符串中使用该密钥来验证请求。
用新的 Accelerate 连接字符串替换您的直接数据库 URL。
# New Accelerate connection string with generated API_KEY
DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=__API_KEY__"
# Previous (direct) database connection string
# DATABASE_URL="postgresql://user:password@host:port/db_name?schema=public"
Prisma Client 在运行时从 DATABASE_URL 读取 prisma:// URL,而 Prisma CLI 命令使用 prisma.config.ts 中定义的连接字符串。
Prisma Migrate 和 Introspection 不适用于 prisma:// 连接字符串。为了继续使用这些功能,请在 .env 文件中添加一个名为 DIRECT_DATABASE_URL 的新变量,其值为直接数据库连接字符串
DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=__API_KEY__"
DIRECT_DATABASE_URL="postgresql://user:password@host:port/db_name?schema=public"
然后将 prisma.config.ts 指向直接连接字符串
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
schema: 'prisma/schema.prisma',
datasource: {
url: env('DIRECT_DATABASE_URL'),
},
})
提供此配置后,迁移和内省将使用 directUrl 连接字符串,而不是 url 中定义的连接字符串。
directUrl对于您执行迁移和内省非常有用。但是,您不需要directUrl即可在应用程序中使用 Accelerate。
如果您将 Prisma 与 PostgreSQL 一起使用,则不需要 directUrl,因为 Prisma Migrate 和 Introspection 适用于 prisma+postgres:// 连接字符串。
2.2. 安装 Accelerate Prisma Client 扩展
💡 Accelerate 需要 Prisma Client 4.16.1 或更高版本以及 @prisma/extension-accelerate 1.0.0 或更高版本。
💡 Accelerate 扩展 @prisma/extension-accelerate 2.0.0 及以上版本需要 Node.js 18 或更高版本。
安装最新版本的 Prisma Client 和 Accelerate Prisma Client 扩展
npm install @prisma/client@latest @prisma/extension-accelerate
2.3. 为 Accelerate 生成 Prisma Client
如果您使用的是 Prisma 5.2.0 或更高版本,Prisma Client 将根据数据库连接字符串中的协议自动确定它应该如何连接到数据库。如果 DATABASE_URL 中的连接字符串以 prisma:// 开头,Prisma Client 将尝试使用 Prisma Accelerate 连接到您的数据库。
在长期运行的应用程序服务器(例如部署在 AWS EC2 上的服务器)中使用 Prisma Accelerate 时,可以通过执行以下命令生成 Prisma Client
npx prisma generate
在无服务器或边缘应用程序中使用 Prisma Accelerate 时,我们建议您运行以下命令来生成 Prisma Client
npx prisma generate --no-engine
--no-engine 标志可防止查询引擎文件包含在生成的 Prisma Client 中,这可确保您的应用程序的捆绑包大小保持较小。
如果您的 Prisma 版本低于 5.2.0,请使用 --accelerate 选项生成 Prisma Client
npx prisma generate --accelerate
如果您的 Prisma 版本低于 5.0.0,请使用 --data-proxy 选项生成 Prisma Client
npx prisma generate --data-proxy
2.4. 使用 Accelerate 扩展您的 Prisma Client 实例
添加以下内容以使用 Accelerate 扩展您的现有 Prisma Client 实例
import { PrismaClient } from '@prisma/client'
import { withAccelerate } from '@prisma/extension-accelerate'
const prisma = new PrismaClient({
accelerateUrl: process.env.DATABASE_URL,
}).$extends(withAccelerate())
如果您要部署到边缘运行时(例如 Cloudflare Workers、Vercel Edge Functions、Deno Deploy 或 Supabase Edge Functions),请改用我们的边缘客户端
import { PrismaClient } from '@prisma/client/edge'
import { withAccelerate } from '@prisma/extension-accelerate'
const prisma = new PrismaClient({
accelerateUrl: process.env.DATABASE_URL,
}).$extends(withAccelerate())
如果 VS Code 无法识别 $extends 方法,请参阅此部分了解如何解决此问题。
将 Accelerate 扩展与其他扩展一起使用
由于扩展是依次应用的,请确保您以正确的顺序应用它们。扩展不能共享行为,最后应用的扩展优先。
如果您在应用程序中使用 Prisma Optimize,请确保在 Accelerate 扩展之前应用它。例如
const prisma = new PrismaClient({
accelerateUrl: process.env.DATABASE_URL,
})
.$extends(withOptimize())
.$extends(withAccelerate())
2.5. 在数据库查询中使用 Accelerate
withAccelerate 扩展主要做两件事
- 让您可以在每个适用的模型方法中访问
cacheStrategy字段,该字段允许您为每个查询定义缓存策略。 - 通过连接池路由所有查询。
没有缓存策略,仅使用连接池
如果您只想利用 Accelerate 的连接池功能而不应用缓存策略,您可以像没有 Accelerate 时一样运行查询。
通过启用 Accelerate 并提供 Accelerate 连接字符串,您的查询现在默认使用连接池。
定义缓存策略
使用新的 cacheStrategy 属性更新查询,该属性允许您为该特定查询定义缓存策略
const user = await prisma.user.findMany({
where: {
email: {
contains: 'alice@prisma.io',
},
},
cacheStrategy: { swr: 60, ttl: 60 },
})
在上面的示例中,swr: 60 和 ttl: 60 意味着 Accelerate 将提供 60 秒的缓存数据,然后在 Accelerate 在后台获取新数据时再提供 60 秒。
您现在应该会看到缓存查询的性能有所提高。
有关哪种策略最适合您的应用程序的信息,请参阅选择缓存策略。
从 Prisma 5.2.0 版本开始,您可以将 Prisma Studio 与 Accelerate 连接字符串一起使用。
使缓存失效并保持缓存查询结果最新
如果您的应用程序需要实时或近实时数据,即使使用较大的 ttl(生存时间)或 swr(陈旧时重新验证)缓存策略,缓存失效也能确保用户看到最新的数据。通过使缓存失效,您可以绕过较长的缓存期,在需要时显示实时数据。
例如,如果仪表板显示客户信息,并且客户的联系方式发生更改,缓存失效允许您立即刷新该数据,确保支持人员始终看到最新信息,而无需等待缓存过期。
要使缓存的查询结果失效,您可以添加标签,然后使用 $accelerate.invalidate API。
按需缓存失效可通过我们的付费计划获得。有关更多详细信息,请参阅我们的定价。
使以下查询失效
await prisma.user.findMany({
where: {
email: {
contains: "alice@prisma.io",
},
},
cacheStrategy: {
swr: 60,
ttl: 60,
tags: ["emails_with_alice"],
},
});
您需要在 $accelerate.invalidate API 中提供缓存标签
try {
await prisma.$accelerate.invalidate({
tags: ["emails_with_alice"],
});
} catch (e) {
if (e instanceof Prisma.PrismaClientKnownRequestError) {
// The .code property can be accessed in a type-safe manner
if (e.code === "P6003") {
console.log(
"You've reached the cache invalidation rate limit. Please try again shortly."
);
}
}
throw e;
}