我在node.js中有十几个左右的lambda函数,它们主要用于mysql数据库查询。
目前,我正在每个函数中打开和关闭与数据库的连接。
是否可以有一个函数只创建连接(最好是池连接)并将其提供给其他函数?
此外,我正在使用参数存储来存储我的 secret 。我现在正在做的是:
const AWS = require('aws-sdk');
var mysql = require('mysql');
var ssm = new AWS.SSM({ apiVersion: '2014-11-06' });
exports.handler = (event, context, callback) => {
var databaseName;
var databaseHost;
var databaseUser;
var databasePassword;
var params = {
Names: ['/databaseName', '/databaseHost', '/databaseUser', '/databasePassword'],
WithDecryption: true
};
ssm.getParameters(params, function (err, data) {
if (err) {
callback(err);
} else {
var parameters = data.Parameters;
parameters.forEach(function (value) {
switch (value.Name) {
case "/databaseName":
databaseName = value.Value;
break;
case "/databaseHost":
databaseHost = value.Value;
break;
case "/databaseUser":
databaseUser = value.Value;
break;
case "/databasePassword":
databasePassword = value.Value;
break;
}
});
var pool = mysql.createPool({
host: databaseHost,
user: databaseUser,
password: databasePassword,
database: databaseName,
connectionLimit: 20
});
pool.getConnection(function (err, connection) {
if (err) {
callback(err);
} else {
var sql = "...";
var inserts = [...];
connection.query(sql, inserts, function (error, results, fields) {
connection.release();
if (error) {
callback(error);
} else {
callback(null, results);
}
});
}
});
}
});
};
我希望数据库连接位于单独的 lambda 函数中,并提供池连接,而无需在每次调用该函数时打开和关闭连接。
最佳答案
当涉及到 AWS Lambda 函数时,您在设计解决方案之前应牢记这些要点
- 函数的执行发生在它们自己的沙盒容器中
- 执行环境没有必要一直保持运行
因此,从第一点,我们可以得出结论,两个函数之间不能共享资源,甚至同一函数的两次执行也无法做到这一点,从第二点,我们可以得出结论,即使您创建一个连接池(我不建议这样做)当容器不服务任何请求时关闭时,它将被销毁。
关于mysql - 如何创建一个 lambda 函数来获取 mysql 池连接并将其提供给其他 lambda 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49913949/