mysql - 如何创建一个 lambda 函数来获取 mysql 池连接并将其提供给其他 lambda 函数?

标签 mysql node.js aws-lambda connection-pooling

我在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 函数时,您在设计解决方案之前应牢记这些要点

  1. 函数的执行发生在它们自己的沙盒容器中
  2. 执行环境没有必要一直保持运行

因此,从第一点,我们可以得出结论,两个函数之间不能共享资源,甚至同一函数的两次执行也无法做到这一点,从第二点,我们可以得出结论,即使您创建一个连接池(我不建议这样做)当容器不服务任何请求时关闭时,它将被销毁。

关于mysql - 如何创建一个 lambda 函数来获取 mysql 池连接并将其提供给其他 lambda 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49913949/

相关文章:

php - mysql中删除的主键不匹配复选框[]数组行号

node.js - 通过 nodemailer 在 Alexa Skill Fact 中发送电子邮件

node.js - 从代码执行 shell 脚本

amazon-web-services - 如何使用 C# 从 S3 存储桶中读取和处理大型文本/CSV 文件?

node.js - 在 Lambda 完成执行之前刷新日志

MYSQL语法连接不等于

php - 原则插入看不到外键字段

mysql - 如何备份数据库数据,使其适合新的数据库结构?

javascript - 使用 Node.js 将许多记录插入 Mongodb 的正确方法

node.js - 亚马逊AWS Lambda : Cannot find "Request"