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 函数时会处于关闭状态,因为连接在第一次调用时已经关闭,因此我最好建议在处理程序内部而不是外部定义连接。
RDS 代理位于您的应用程序和数据库之间,除了使用代理端点之外,不应导致任何应用程序更改。
我应该在执行查询后关闭连接还是将其保持打开状态以供 RDS 代理处理?
无论您是否使用数据库代理,都不应该让数据库连接保持打开状态。
连接是一种有限且相对昂贵的资源。
经验法则是尽可能晚地打开连接并尽快关闭数据库连接。未显式关闭的连接可能不会添加或返回到池中。关闭数据库连接是一个好的数据库客户端。
让数据库资源与许多开放连接相关联,您会发现自己的数据库实例需要更多 vCPU,这会导致 RDS 代理价格更高。
如果我应该关闭连接,那么首先使用 RDS 代理的意义何在?
关键是,您的 Amazon RDS 代理实例会为您维护一个已建立的与 RDS 数据库实例的连接池 - 它位于您的应用程序和 RDS 数据库之间。
代理不负责关闭您建立的本地连接,也不应该这样做。
它负责通过自动管理连接多路复用/池和共享来为需要它的应用程序提供帮助。
AWS 文档中明确提到了需要它的应用程序示例:
许多应用程序(包括基于现代无服务器架构构建的应用程序)可以与数据库服务器建立大量打开的连接,并且可能会以很高的速率打开和关闭数据库连接,从而耗尽数据库内存和计算资源。
为了避免任何疑问,请随时查看 AWS 提供的关闭连接的示例(链接至文档),或查看 AWS 计算博客中的另一个示例。
| 归档时间: |
|
| 查看次数: |
5094 次 |
| 最近记录: |