Prisma Accelerate 连接池与查询缓存
Accelerate 是什么
Prisma Accelerate 是 Prisma 官方推出的托管连接池 + 全球查询缓存服务。它的核心价值是:
- 连接池:帮你管理对数据库的连接,特别是 Serverless/Edge 环境下连接数耗尽的问题
- 查询缓存:把不常变的查询结果缓存到全球 300+ 边缘节点,直接返回不查数据库
Accelerate 支持 PostgreSQL、MySQL、MongoDB 等主流数据库,即将在 2026 年 12 月退役(官方宣布),会被 Prisma Postgres 内置的连接池替代。
什么时候需要 Accelerate
Serverless / Edge 环境
这是 Accelerate 最核心的场景。Vercel Functions、Cloudflare Workers、Netlify Functions 等 Serverless 平台:
- 每次函数冷启动建立新的数据库连接
- 并发量上来时数据库连接数容易超出上限(PostgreSQL 默认 100)
- 冷启动建立连接 + 查询可能要 1~3 秒
Accelerate 把这些函数的连接都汇聚到自己的连接池里,后端只维护有限数量的持久连接到真正的数据库。
高流量读多写少场景
如果你有大量不常变的查询(比如商品详情页、用户资料、文章内容),可以用查询缓存把这些查询结果缓存 60 秒或更久。缓存命中时完全不查数据库,延迟从几十毫秒降到几毫秒。
什么时候不需要
- 本地开发(连接不是问题)
- 传统长驻后端(Express、NestJS 已经有内置连接池)
- Prisma Postgres 用户(自带连接池,但查询缓存仍需要 Accelerate)
配置 Accelerate
第一步:Prisma Console 创建项目
去 console.prisma.io 注册登录,创建一个项目,选择 "Add to existing database"。Prisma Console 会生成一个 Accelerate 连接字符串,格式大概是:
prisma://accelerate.prisma-data.net/?api_key=xxx
第二步:Schema 里配置
datasource db {
provider = "postgresql"
url = env("DATABASE_URL") // Accelerate 连接串
directUrl = env("DIRECT_URL") // 直连数据库(migrate 用)
}
generator client {
provider = "prisma-client-js"
previewFeatures = ["accelerate"] // v7 起可能不再需要
}
.env 里:
DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=xxx"
DIRECT_URL="postgresql://user:password@actual-host:5432/dbname"
关键:DATABASE_URL 指向 Accelerate,DIRECT_URL 指向真正的数据库。迁移走 DIRECT_URL,应用运行走 DATABASE_URL。
第三步:安装驱动适配器
Prisma Accelerate 需要通过驱动适配器(driver adapter)与底层数据库通信:
npm install @prisma/adapter-pg
# 或 MySQL: npm install @prisma/adapter-mysql
第四步:代码里配置驱动
// src/lib/prisma.ts
import { PrismaPg } from '@prisma/adapter-pg'
import { PrismaClient } from '@prisma/client'
const adapter = new PrismaPg()
export const prisma = new PrismaClient({
adapter,
})
第五步:generate
npx prisma generate
查询缓存策略
配置好 Accelerate 后,在任何查询上加 cacheStrategy 即可开启缓存:
// TTL 60 秒:60 秒内直接返回缓存
const posts = await prisma.post.findMany({
cacheStrategy: { ttl: 60 },
})
// TTL + SWR(stale-while-revalidate):
// 缓存 60 秒,过期后还能继续用陈旧缓存,最多再等 10 秒同时后台重新拉取
const products = await prisma.product.findMany({
cacheStrategy: { ttl: 60, swr: 10 },
})
// 复杂查询的缓存
const stats = await prisma.order.aggregate({
_sum: { totalAmount: true },
cacheStrategy: { ttl: 30, swr: 5 },
})
缓存刷新
缓存自动在两种情况下刷新:
- TTL 过期
- 你对对应表做了写操作(create/update/delete)——Accelerate 自动失效相关缓存
也可以手动清空某个查询的缓存:
await prisma.post.findMany({
cacheStrategy: { ttl: 0 }, // TTL=0 跳过缓存直接查数据库
})
缓存粒度
缓存是按查询维度的——相同参数的查询才会命中。不同 where 条件、不同 select/include 参数会生成不同的缓存条目。不要把 TTL 设太短——频繁变化的查询缓存命中率会很低。
数据库支持
Accelerate 工作在你已有的数据库之上,不改变数据库本身。支持的数据库:
- PostgreSQL(含 Supabase、Neon、CockroachDB)
- MySQL(含 PlanetScale、TiDB)
- MongoDB
替代方案(Accelerate 退役后)
Prisma 宣布 Accelerate 将在 2026 年 12 月退役。替代路径:
- 连接池需求 → 换 Prisma Postgres(自带连接池)或自己用 PgBouncer / Supavisor
- 查询缓存需求 → 自己用 Redis / Upstash 做应用层缓存
- 不想改现有数据库 → Prisma 提供了迁移指南,帮你移除 Accelerate 依赖