NextJS(App Router)中的数据库连接

发布: (2026年1月5日 GMT+8 00:50)
3 min read
原文: Dev.to

Source: Dev.to

介绍

在本文中,我们将探讨一种可靠的方式,将 Next.js 应用(App Router)通过 Prisma ORM 连接到数据库。

什么是 Prisma ORM?

Prisma(对象关系映射)简化了与数据库的交互。与其为 MySQL、PostgreSQL、SQLite 或 MongoDB 编写原始 SQL 查询,你可以使用类型安全的客户端来抽象底层语法。

使用 ORM 的好处

  • 无需记住数据库特定的查询语法。
  • 减少因小错误导致的调试时间。
  • 更容易切换数据库。

在 Next.js App Router 中连接 Prisma

下面是一个简洁且可用于生产环境的 Prisma 客户端设置示例,能够很好地配合 Next.js 的 App Router 使用。

// lib/prisma.ts
import { PrismaClient } from "@/generated/prisma/client";
import { PrismaPg } from "@prisma/adapter-pg";

const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined;
};

const connectionString = `${process.env.DATABASE_URL}`;

const adapter = new PrismaPg({ connectionString });

export const prisma =
  globalForPrisma.prisma || new PrismaClient({ adapter });

if (process.env.NODE_ENV !== "production") {
  globalForPrisma.prisma = prisma;
}

工作原理

  1. 适配器创建PrismaPgprocess.env.DATABASE_URL 中获取连接字符串。
  2. 单例模式 – 客户端存储在全局变量 (globalForPrisma.prisma) 中。
    • 在生产环境,同一个 Prisma 实例会在同一服务器实例的多个请求之间复用,避免为每个请求创建新的数据库连接。
    • 在开发环境,热重载否则会在每次重新加载时创建新客户端。将客户端全局存储可确保在开发期间只打开一个连接。

为什么需要这些额外代码?

当 Next.js 应用部署后,可能会并发运行多个服务器实例。每个实例可以处理大量传入请求,但我们不希望为每个请求都建立单独的数据库连接。

  • 模块缓存:导入 Prisma 客户端模块时,会复用同一服务器实例上已经创建的实例。
  • 全局存储(开发):开发模式下的热模块替换会在每次重新加载时实例化新客户端,导致大量不必要的连接。全局缓存可以防止这种情况。

遵循此模式,你可以在保持 Prisma 类型安全 API 的同时,将活跃的数据库连接数保持在较低水平。

Back to Blog

相关文章

阅读更多 »

WTF 是关系数据库即服务?

什么是 Relational Database?Relational Database 将数据组织成表,每个表都有行和列——就像 Excel 电子表格一样。This s...