You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js API Routes作为后端时数据库连接无法持久存活问题求助

Next.js API路由数据库连接复用解决方案

Next.js API路由默认运行在Serverless执行环境,每次请求的上下文独立,请求处理完成后运行实例会被平台回收,因此无法像传统常驻Node服务一样维持长期的数据库连接,这是Serverless架构的通用特性。
以下是可行的落地方案:

  • 实现数据库连接单例缓存
    修改你的数据库初始化代码(也就是../models/index对应的逻辑),将已建立的连接挂载到全局对象上复用,避免每次请求都重建连接,示例代码(以Sequelize为例):
import { Sequelize } from 'sequelize'

// 全局缓存数据库实例
let sequelize = global.sequelize

if (!sequelize) {
  sequelize = new Sequelize(process.env.DATABASE_URL, {
    // 连接池配置适配Serverless环境
    pool: {
      max: 2,
      min: 0,
      idle: 10000, // 空闲连接10秒后释放
      acquire: 30000, // 获取连接超时时间30秒
    }
  })
  // 开发环境下挂载到全局对象避免热重载重复创建连接
  if (process.env.NODE_ENV !== 'production') global.sequelize = sequelize
}

export const models = initModels(sequelize)

调整后你原有的API路由代码不需要做修改,直接导入models使用即可,同实例的多次请求会复用同一个数据库连接。

  • 适配Serverless环境的连接策略
    如果你的应用请求量不高,冷启动频率高,可以额外做以下配置优化:
    • 调低数据库服务端的连接超时时间,避免残留的无效连接占满数据库连接数
    • 对于PostgreSQL/MySQL类数据库,可以优先选用对应云服务商提供的Serverless专用HTTP驱动,完全规避TCP长连接维护的问题
  • 高频访问场景使用Edge Runtime
    如果你的API路由QPS较高,可以切换为Edge Runtime,配合支持Edge环境的数据库驱动实现更低延迟的请求处理,只需要在你的API路由文件顶部加运行时声明即可:
export const config = {
  runtime: 'edge',
}

// 原有handler逻辑保持不变
import { models } from "../models/index"

export default async function handler(req, res) {
  const User = models.User
  try {
    const result = await User.findAll()
    return res.json({ result })
  } catch (err) {
    console.error("Error occured ", err)
    return res.json({ result: [] })
  }
}

内容的提问来源于stack exchange,提问作者xargr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:45:03