
示例工程【免费下载链接】prisma-examples Ready-to-run Prisma example projects项目地址https://gitcode.com/gh_mirrors/pr/prisma-examples点击查看免费下载本篇指南以 prisma-examples 仓库中的 accelerate/nuxtjs-starter 项目为蓝本讲解如何在 Nuxt.js 应用中通过 Prisma ORM 与 Prisma Accelerate 的组合构建一个带多种缓存策略的语录生成器Quote Generator。读完本文你将掌握 Accelerate 的 TTL、SWR、TTLSWR 与无缓存四种策略的配置方式、cacheStrategy与withAccelerateInfo()的底层调用链以及如何从运行指标中判断缓存命中状态从而在真实项目中权衡性能与数据新鲜度。项目概览语录生成器如何工作该项目是一个可直接运行的 Nuxt.js 应用页面从预置的名言集中检索最近新增的一条名言并分别以开启缓存和不开启缓存两种方式返回用于直观对比 Accelerate 各缓存策略对数据库压力的影响。其核心流程可以拆解为三个步骤Fetch a quote取名言检索最近添加的名言按id倒序取第一条分别在有缓存与无缓存两种路径下执行Apply caching strategy应用缓存策略根据请求参数决定采用 TTL、SWR、TTLSWR 或完全不缓存中的哪一种策略Return the quote返回结果返回名言本身同时附带缓存状态、缓存节点区域、命中时间等元数据。从项目源码结构看这个三步走分别落在三个不同的代码层API 路由server/api/quotes.ts负责解析缓存策略参数查询层lib/utils/query.ts负责携带cacheStrategy执行 Prisma 查询并采集性能信息视图层pages/index.vue负责并行发起四种策略的请求并渲染结果。README 中明确指出该项目演示了 Accelerate 提供的全部缓存策略是学习 Accelerate 缓存体系的最小完整范例。前置条件在开始之前你需要准备以下两项连接串一个公网可访问数据库的连接串示例项目使用 PostgreSQL见下文 Schema 分析Accelerate 连接串包含Accelerate API Key的 Accelerate 连接串。你需要在 Prisma Data Platform 中为项目启用 Accelerate 后获取。Accelerate 连接串具有如下固定结构prisma://accelerate.prisma-data.net/?api_key__YOUR_ACCELERATE_API_KEY__其中__YOUR_ACCELERATE_API_KEY__是你在 Prisma Data Platform 生成的 API Key。这条连接串会同时承担数据库代理 连接池 缓存层三重职责Prisma Client 的所有查询都经由它转发。从零跑起来完整启动步骤1. 克隆仓库并安装依赖克隆 prisma-examples 仓库可使用--depth1浅克隆以加速进入示例目录并安装依赖git clone https://gitcode.com/gh_mirrors/pr/prisma-examples.git --depth1 cd prisma-examples/accelerate/nuxtjs-starter npm install依赖清单以 package.json 为准核心依赖包括nuxt3.19.0、prisma/client7.0.0、prisma/extension-accelerate2.0.2Accelerate 客户端扩展、prisma/nuxt0.3.0Nuxt 集成模块、zod3.25.76参数校验以及tsx用于运行种子脚本。2. 配置环境变量在项目根目录创建.env文件并写入两个变量touch .env# .env # Accelerate connection string (used for queries by Prisma Client) DATABASE_URL__YOUR_ACCELERATE_CONNECTION_STRING__ NUXT_PUBLIC_URLhttp://localhost:3000DATABASE_URL填入上一步获取的 Accelerate 连接串形如prisma://accelerate.prisma-data.net/?api_key...。注意__YOUR_ACCELERATE_CONNECTION_STRING__是占位符必须替换为真实值NUXT_PUBLIC_URL前端页面发起请求时使用的服务地址默认http://localhost:3000。该变量在 lib/utils/helper.ts 中被读取并作为HOST导出供页面层拼接 API 地址使用。值得一提的是示例采用新版 prisma.config.ts 集中管理 Prisma 配置schema指向prisma/schema.prismamigrations.path指向迁移目录seed命令为tsx ./prisma/seed.ts而datasource.url通过env(DATABASE_URL)读取。这意味着 Schema 中无需再内联数据库地址配置职责更清晰。3. 执行迁移建表并写入种子数据Prisma Schema 中定义了一个Quotes模型。执行以下命令将该模型映射到数据库并创建对应的表npx prisma migrate dev --name init执行成功后数据库中将出现一张空的Quotes表。接着运行种子脚本写入示例数据npx prisma db seed种子逻辑位于 prisma/seed.ts使用prisma.quotes.createMany({ skipDuplicates: true })一次性写入 20 条名人名言如 The only way to do great work is to love what you do.、You miss 100% of the shots you dont take. 等skipDuplicates保证重复执行不会产生重复记录。4. 生成 Prisma Client执行生成命令产出类型安全的客户端代码npx prisma generate本项目采用 Prisma 7 的prisma-client生成器输出目录为./prisma/generated见 prisma/schema.prisma生成的客户端随后会被 lib/prisma.ts 与种子脚本引用。5. 启动开发服务器npm run dev由于schema与迁移目录都已就绪启动时会跳过安装 Prisma CLI创建 Prisma Schema等引导提示。此外nuxt.config.ts 中通过prisma: { autoSetupPrisma: false }关闭了自动初始化避免重复引导。但 Nuxt DevTools 仍会询问是否安装 Prisma Studio 用于可视化编辑数据Do you want to view and edit your data by installing Prisma Studio in Nuxt DevTools? › (Y/n)选择Y即可在 DevTools 中直接浏览与编辑Quotes表。6. 在浏览器中验证效果打开浏览器访问http://localhost:3000即可看到Accelerated Quotes页面。页面底部会展示四种缓存策略各自的性能与统计信息如缓存命中状态 cache/hit深入源码缓存策略在 API 层如何落地缓存策略的分发入口是 server/api/quotes.ts。该文件基于 Nuxt 3 / h3 的defineEventHandler实现完整逻辑如下import { defineEventHandler, getQuery, createError } from h3; import { z } from zod; import { getQuotes } from /lib/utils/query; export default defineEventHandler(async (event) { const { cache } getQuery(event); const parser z.enum([TTL, SWR, BOTH, NONE]); const parsedOutput await parser.safeParseAsync(cache); if (!parsedOutput.success) { throw createError({ statusCode: 400, statusMessage: Invalid search parameter. }); } let map new Map(); map.set(TTL, { ttl: 30 }); map.set(SWR, { swr: 30 }); map.set(BOTH, { ttl: 30, swr: 60 }); map.set(NONE, undefined); const data await getQuotes(map.get(parsedOutput.data)); return data; });这段代码揭示了几个关键设计参数白名单校验cache查询参数必须严格属于TTL / SWR / BOTH / NONE四选一使用z.enum配合safeParseAsync做异步校验非法参数直接返回400 Invalid search parameter避免误传参数导致意外缓存行为策略到参数对象的映射四种策略被映射为cacheStrategy选项——TTL{ ttl: 30 }30 秒内命中缓存直接返回缓存未过期前不访问数据库SWR{ swr: 30 }Stale-While-Revalidate过期后先返回旧值再后台刷新兼顾响应速度与数据更新BOTH{ ttl: 30, swr: 60 }TTL 与 SWR 组合30 秒内强缓存3060 秒间以 SWR 方式返回旧数据并异步更新NONEundefined不启用任何缓存仅使用 Accelerate 的连接池能力作为对照基线。单一查询函数复用四种策略共用同一个getQuotes()仅在入参上区分代码零重复。从查询层 lib/utils/query.ts 可以看到cacheStrategy的完整用法export const getQuotes async (strategy?: CacheStrategy) { const start Date.now(); const result await prisma.quotes .findMany({ cacheStrategy: strategy, orderBy: { id: desc }, take: 1, }) .withAccelerateInfo(); return { data: result?.data?.[0], info: result.info, time: Date.now() - start, }; };要点如下cacheStrategy作为 Prisma 查询选项直接传给findMany不传或传undefined时只走连接池、不走缓存这正是NONE策略的实现方式.withAccelerateInfo()是 Accelerate 扩展提供的链式方法查询完成后会追加一个info字段其中包含缓存状态、缓存节点区域、请求 ID 等诊断信息查询按id: desc倒序并take: 1语义为最近新增的一条名言返回值同时携带data名言本体、infoAccelerate 元数据与time从发起到返回的耗时毫秒数time供页面层直观展示性能对比。缓存策略与信息类型的完整定义lib/types/index.ts 给出了这套机制的类型化契约是理解全链路的关键export type CacheStrategy | { ttl: number; swr: number } | { ttl: number } | { swr: number }; export type AccelerateInfo { cacheStatus: ttl | swr | miss | none; lastModified: Date; region: string; requestId: string; signature: string; }; export type Quote { id: number; quote: string; createdAt: string; }; export type QuoteResult { data: Quote; info: AccelerateInfo; time: number; }; export type QuoteCacheType SWR | TTL | No caching | TTL SWR;其中AccelerateInfo.cacheStatus是判断缓存行为的核心指标取值含义如下cacheStatus含义是否命中缓存ttl命中 TTL 缓存直接返回缓存数据是CACHE HITswr命中 SWR 缓存返回旧数据并触发后台刷新是CACHE HITmiss缓存未命中回源数据库查询否none未启用缓存即NONE策略否lastModified表示缓存数据的最后修改时间region表示处理请求的 Accelerate 缓存节点区域requestId可用于跨端排查单次请求。客户端如何构建与缓存诊断信息对接lib/prisma.ts 负责创建经过 Accelerate 扩展的 Prisma Client 单例import { PrismaClient } from ../prisma/generated/client; import { withAccelerate } from prisma/extension-accelerate const prismaClientSingleton () { return new PrismaClient({ accelerateUrl: process.env.DATABASE_URL, }).$extends(withAccelerate()) } const prisma globalThis.prismaGlobal ?? prismaClientSingleton() export default prisma if (process.env.NODE_ENV ! production) globalThis.prismaGlobal prisma这里有两个值得注意的实现细节accelerateUrl注入将.env中的DATABASE_URL即 Accelerate 连接串作为accelerateUrl传入PrismaClient构造器再通过$extends(withAccelerate())挂载 Accelerate 能力。这也解释了为何 prisma/schema.prisma 的datasource中只有provider postgresql而没有url——连接地址统一由prisma.config.ts与运行时环境变量管理开发环境热更新单例沿用 Next.js 社区经典的globalThis缓存模式在非生产环境下将实例挂到globalThis避免 Nuxt 开发模式热更新时反复创建 Prisma Client 导致连接数膨胀。种子脚本 prisma/seed.ts 使用了相同的new PrismaClient({ accelerateUrl }).$extends(withAccelerate())写法。前端视图四种策略同屏对比页面层 pages/index.vue 使用 Nuxt 内置的useFetch并行发起四个请求恰好对应四种缓存策略const { data: ttl } useFetchQuoteResult(() ${HOST}/api/quotes?cacheTTL); const { data: swr } useFetchQuoteResult(() ${HOST}/api/quotes?cacheSWR); const { data: both } useFetchQuoteResult(() ${HOST}/api/quotes?cacheBOTH); const { data: none } useFetchQuoteResult(() ${HOST}/api/quotes?cacheNONE);四个卡片分别渲染TTLSWRTTL SWRNo caching的结果。卡片组件 components/Quote.vue 是缓存诊断信息的前端呈现层其判定逻辑直接复用了cacheStatus的语义const cacheStatus computed(() props.result?.info?.cacheStatus || );span classfont-bold :class{ text-green-400: cacheStatus swr || cacheStatus ttl, text-red-400: cacheStatus ! swr cacheStatus ! ttl } {{ cacheStatus?.toUpperCase() }} {{ cacheStatus swr || cacheStatus ttl ? CACHE HIT : }} /span即当cacheStatus为swr或ttl时以绿色显示并标注CACHE HIT其余miss/none以红色显示。除此之外卡片还展示以下指标Cache Node Region处理本次请求的 Accelerate 缓存节点区域来自info.region可帮助确认请求是否被就近的缓存节点承接Cached Modified at缓存数据的最后修改时间来自info.lastModifiedCache status上述cacheStatus的命中判定Time taken单次请求耗时result.time毫秒用于直观对比缓存与直连数据库的延迟差异。外层布局由 app.vue 提供Accelerated Quotes 标题、说明文案以及一个Refresh按钮内部实现为window.location.reload()方便反复刷新观察缓存命中状态随时间推移的变化——例如 TTL 30 秒过期后再次刷新cacheStatus会从ttl变为miss耗时随之上升。运行效果解读与上手建议启动后反复刷新页面可以观察到一个清晰的对照实验NONE卡片每次请求都回源数据库耗时相对稳定TTL卡片在 30 秒内刷新会命中缓存绿色TTL CACHE HIT超时后首次刷新变为missSWR卡片在旧数据过期后仍能立即返回数据并后台刷新BOTH卡片则在前 30 秒强缓存、3060 秒间 SWR 的窗口内展示组合策略的行为。若配合 Prisma Studio 修改某条名言后立即刷新还能直观验证缓存期间数据不实时这一特性。针对不同业务场景可以给出如下选型建议数据几乎不变化、对延迟极度敏感的场景优先使用TTL允许短暂展示旧数据、希望响应始终快速的场景使用SWR需要兼顾强缓存与最终一致性的场景使用TTL SWR组合数据实时性要求极高、或仅需连接池聚合时使用NONEcacheStrategy传undefined。此外本仓库的 accelerate/nextjs-starter其 lib/utils/query.ts 还额外提供了addQuote写入示例、accelerate/astro-starter 等兄弟项目共享同一套withAcceleratewithAccelerateInfo用法可作为跨框架迁移的参考。更底层的cacheStrategy选项完整说明可查阅 Prisma Accelerate 官方缓存文档。总结通过这个 Nuxt.js Starter可以一次性看清 Prisma Accelerate 缓存体系的完整链路?cache查询参数经 zod 白名单校验后被映射为cacheStrategy查询选项查询通过$extends(withAccelerate())扩展后的客户端执行并由.withAccelerateInfo()带回cacheStatus、region、lastModified等诊断元数据最终由前端卡片组件将ttl/swr/miss/none四种状态渲染为可视化的命中指标。对任何希望在生产项目中引入 Prisma Accelerate 缓存、又需要可量化对比收益的团队而言这份示例都是值得直接复用的起点。赞分享示例工程【免费下载链接】prisma-examples Ready-to-run Prisma example projects项目地址https://gitcode.com/gh_mirrors/pr/prisma-examples点击查看免费下载相关推荐Prisma Accelerate终极指南如何通过缓存策略提升应用性能300%Prisma Accelerate终极指南如何通过缓存策略提升应用性能300% 想要让你的数据库查询速度提升3倍以上吗Prisma Accelerat示例工程MediaGo 前端实践用显式条件渲染杜绝 0 与 NaN 泄漏进 JSXMediaGo 前端实践用显式条件渲染杜绝 0 与 NaN 泄漏进 JSX 导读 在 React / TSX 组件开发中 {count span {示例工程Prisma Accelerate 深度应用连接池与全局缓存优化Prisma Accelerate 深度应用连接池与全局缓存优化 本文深入探讨了Prisma Accelerate的核心功能包括连接池配置与管理、全局缓存策示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考