Prisma 中文文档 下载 App

Prisma Accelerate 连接池与查询缓存

Accelerate 是什么

Prisma Accelerate 是 Prisma 官方推出的托管连接池 + 全球查询缓存服务。它的核心价值是:

Accelerate 支持 PostgreSQL、MySQL、MongoDB 等主流数据库,即将在 2026 年 12 月退役(官方宣布),会被 Prisma Postgres 内置的连接池替代。

什么时候需要 Accelerate

Serverless / Edge 环境

这是 Accelerate 最核心的场景。Vercel Functions、Cloudflare Workers、Netlify Functions 等 Serverless 平台:

Accelerate 把这些函数的连接都汇聚到自己的连接池里,后端只维护有限数量的持久连接到真正的数据库。

高流量读多写少场景

如果你有大量不常变的查询(比如商品详情页、用户资料、文章内容),可以用查询缓存把这些查询结果缓存 60 秒或更久。缓存命中时完全不查数据库,延迟从几十毫秒降到几毫秒。

什么时候不需要

配置 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 },
})

缓存刷新

缓存自动在两种情况下刷新:

  1. TTL 过期
  2. 你对对应表做了写操作(create/update/delete)——Accelerate 自动失效相关缓存

也可以手动清空某个查询的缓存:

await prisma.post.findMany({
  cacheStrategy: { ttl: 0 },  // TTL=0 跳过缓存直接查数据库
})

缓存粒度

缓存是按查询维度的——相同参数的查询才会命中。不同 where 条件、不同 select/include 参数会生成不同的缓存条目。不要把 TTL 设太短——频繁变化的查询缓存命中率会很低。

数据库支持

Accelerate 工作在你已有的数据库之上,不改变数据库本身。支持的数据库:

替代方案(Accelerate 退役后)

Prisma 宣布 Accelerate 将在 2026 年 12 月退役。替代路径:

  1. 连接池需求 → 换 Prisma Postgres(自带连接池)或自己用 PgBouncer / Supavisor
  2. 查询缓存需求 → 自己用 Redis / Upstash 做应用层缓存
  3. 不想改现有数据库 → Prisma 提供了迁移指南,帮你移除 Accelerate 依赖