我从理论上一直学到,与数据库建立新连接是昂贵的操作。因此,我们应该保持开放的连接池并将其用于数据库操作。
在考虑AWS lambda时。假设lambda函数要在db上运行,那么我们需要创建与db的连接。操作后,需要关闭数据库。如果同时执行100个lambda函数,则将完成100个数据库连接打开/关闭。从理论上讲,这是错误的模式。
如果是这样,那么在涉及数据库操作时使用AWS lambda是否不合适?
答案 0 :(得分:1)
连接池在无服务器上正常工作 即
const mysql = require('mysql');
const pool = mysql.createPool({
host: {Your Host},
user: {Your Username},
password: {Your Password},
database: {Your Database},
port: 3306
});
exports.main = function main (req) {
let query = ""
return new Promise(function(resolve, reject){
return resolve({
statusCode: 200,
body: "Success"
});
})
}
答案 1 :(得分:1)
为什么您需要关闭DB
连接,而不在Lambda
函数中重用它?
每运行Lambda
个函数意味着一个Container
,它们在运行后会存活一段时间(大约10分钟,如果您连续调用它,它将保持存活)。
保持活动状态意味着每个Lambda
函数在运行后都会保留其内存区域,以便可以重用它们。
例如,如果您在Lambda
函数中定义一个全局变量,如下所示。
(尽管它是python代码,但我认为您可以理解,因为它非常简单)
variable = 10
def lambda_function(event, context):
global variable
print(variable)
variable += 1
如果每1秒钟调用一次Lambda
函数,它将如下所示打印。
10
11
12
13
14
.
.
.
如您所见,每个调用的Lambda
函数都使用相同的全局变量。
如果全局变量是数据库连接怎么办?您可以重用它们,而不必在每次lambda调用时重新打开连接。
但是,正如您所说,如果同时执行100个Lambda
函数,由于每个Lambda
并发分别意味着不同的Containers
并具有不同的存储区域,因此将打开100个连接。
但是最终,将重复使用100个连接以连续执行100个同时
。----------编辑----------
我同意@Arun
的评论。当流量稳定且逐渐增加和减少时,我的答案将很有用,这样连接可以被服务器端的保持活动充分复用和关闭。流量的急剧增加和减少可能浪费数据库连接,无法正确关闭。