我应该关闭 AWS Lambda 函数内的 RDS 代理连接吗?

Ahm*_*bil 9 amazon-rds aws-lambda amazon-rds-proxy

我将 Lambda 与 RDS Proxy 结合使用,以便能够重用与 MySQL 数据库的数据库连接。

我应该在执行查询后关闭连接还是将其保持打开状态以供 RDS 代理处理?

如果我应该关闭连接,那么首先使用 RDS 代理的意义何在?

这是我的 lambda 函数的示例:

const mysql = require("mysql2/promise")

const config = {
  host: process.env.RDS_HOST, // RDS Proxy endpoint here
  user: process.env.RDS_USER,
  database: process.env.RDS_DATABASE,
  password: process.env.RDS_PASSWORD,
  ssl: "Amazon RDS"
}

exports.handler = async (event) => {
  let connection

  try {
    connection = await mysql.createConnection(config)
    console.log(`Connected to db. ConnectionId: ${connection.threadId}`)

    // Do some queries
  } catch (err) {
    return handleError(err)
  } finally {
    if (connection) await connection.end() // Should I close the connection here?
  }

  return response(200, "Success")
}
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,在处理程序外部(全局范围)初始化连接将使 lambda 函数在同一执行环境中的调用之间保留连接变量的值,这将导致以下错误Can't add new command when connection is in在短时间内多次调用 lambda 函数时会处于关闭状态,因为连接在第一次调用时已经关闭,因此我最好建议在处理程序内部而不是外部定义连接。

Erm*_*ary 9

TDLR:始终关闭数据库连接

RDS 代理位于您的应用程序和数据库之间,除了使用代理端点之外,不应导致任何应用程序更改。


我应该在执行查询后关闭连接还是将其保持打开状态以供 RDS 代理处理?

无论您是否使用数据库代理,都不应该让数据库连接保持打开状态。

连接是一种有限且相对昂贵的资源。

经验法则是尽可能晚地打开连接并尽快关闭数据库连接。未显式关闭的连接可能不会添加或返回到池中。关闭数据库连接是一个好的数据库客户端。

让数据库资源与许多开放连接相关联,您会发现自己的数据库实例需要更多 vCPU,这会导致 RDS 代理价格更高。


如果我应该关闭连接,那么首先使用 RDS 代理的意义何在?

关键是,您的 Amazon RDS 代理实例会为您维护一个已建立的与 RDS 数据库实例的连接池 - 它位于您的应用程序和 RDS 数据库之间。

代理不负责关闭您建立的本地连接,也不应该这样做。

它负责通过自动管理连接多路复用/池和共享来为需要它的应用程序提供帮助。

AWS 文档中明确提到了需要它的应用程序示例:

许多应用程序(包括基于现代无服务器架构构建的应用程序)可以与数据库服务器建立大量打开的连接,并且可能会以很高的速率打开和关闭数据库连接,从而耗尽数据库内存和计算资源。


为了避免任何疑问,请随时查看 AWS 提供的关闭连接的示例链接至文档),或查看 AWS 计算博客中的另一个示例