【发布时间】:2017-09-10 08:09:03
【问题描述】:
我正在尝试在我在 Amazon Lambda 上运行的 NodeJS 服务中使用 mysql 池。 这是我使用数据库的模块的开始:
console.log('init database module ...');
var settings = require('./settings.json');
var mysql = require('mysql');
var pool = mysql.createPool(settings);
从亚马逊控制台的日志中可以看出,这段代码经常被执行:
- 如果我刚刚部署了服务并同时执行了 10 个请求 - 所有这 10 个请求都会执行这段代码。
- 如果我在第一个系列之后立即再次同时执行 10 个请求 - 它们不会执行此代码。
- 如果从上次查询过去了一段时间 - 一些请求会重新执行该代码。
即使我使用 global - 这会减少但不会消除重复:
if (!global.pool) {
console.log('init database module ...');
var settings = require('./settings.json');
var mysql = require('mysql');
global.pool = mysql.createPool(settings);
}
此外,如果请求执行有一些错误 - 这段代码在请求之后执行,并且此时 global.pool 为空。
那么,这是否意味着无法在 Amazon Lambda 中使用池? 有什么办法可以让亚马逊每次都使用同一个池实例吗?
【问题讨论】:
-
您在第 1、2 和 3 点中描述的所有内容都与 Lambda 中的多个容器和 container reuse 一致。你熟悉这个吗?
-
结论是什么?池化没有意义,对吧?
-
虽然没有提供池的全部好处,但您可以在处理函数之外使用 mysql.createPool() 并在完成后使用 connection.destroy()。见stackoverflow.com/questions/14087924/…
标签: node.js aws-lambda