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

在Express服务端应用中,何时创建DynamoDB连接才合适?

Should I instantiate a DynamoDB client globally or per request in an Express app?

绝对要全局实例化DynamoDB客户端,别为每个请求新建连接——这不仅是Node.js+AWS场景的最佳实践,更是AWS SDK设计时就预设的正确用法,给你掰扯清楚为啥:

  • SDK自带连接池复用能力
    不管你用AWS SDK v2还是v3,DynamoDB客户端都会自动维护一个HTTP连接池(默认大小50)。全局创建一次实例后,所有API请求都会复用池里的连接,省去了每次新建TCP连接的握手、认证等开销,性能提升不是一星半点。要是每个请求都新建客户端,等于每次都重新初始化连接池,既浪费内存,还可能触发DynamoDB的连接数限制,搞不好还会被限流。

  • 全局实例完全安全
    Express是单线程事件循环模型,而AWS SDK的客户端实例是天生适配这种模型的——它是线程安全的,多个并发请求同时调用同一个客户端的方法,根本不会出现竞态问题或者数据混乱,放心用就行。

给你个实际代码示例(SDK v3)

先单独写一个客户端文件,全局初始化:

// src/utils/dynamodb-client.js
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";

// 只执行一次的全局实例
const ddbClient = new DynamoDBClient({
  region: "us-east-1",
  // 可以按需配置连接池参数,比如超时、重试次数等
});

export default ddbClient;

然后在Express路由里直接引用这个全局实例:

// src/routes/user.js
import express from "express";
import ddbClient from "../utils/dynamodb-client.js";
import { GetItemCommand } from "@aws-sdk/client-dynamodb";

const router = express.Router();

router.get("/:userId", async (req, res) => {
  try {
    const getItemCmd = new GetItemCommand({
      TableName: "UserTable",
      Key: { userId: { S: req.params.userId } }
    });
    const result = await ddbClient.send(getItemCmd);
    res.json(result.Item || { message: "User not found" });
  } catch (err) {
    console.error("DynamoDB error:", err);
    res.status(500).json({ error: "Failed to fetch user" });
  }
});

export default router;

澄清个常见误区

有人怕全局实例会导致内存泄漏或者连接占着不放?完全不用担心——AWS SDK会自动管理连接池的生命周期,闲置的连接到了超时时间会自动关闭,根本不需要你手动处理。

要是你需要不同配置的客户端(比如不同区域、不同凭证),可以创建多个全局实例,但绝对不要在请求处理函数里新建客户端,那纯粹是对服务器资源的浪费。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:58:15