我有一个连接到MongoDB实例的lambda函数,并且正在添加连接池重用逻辑,以便当lambda重用容器时,重用以前的连接,而不是创建新的连接。
在我的database.ts
文件中,以前在代码中的每个地方都使用了一个export const db = mongo.createConnection(..)
,它在每次函数调用时都创建了一个新连接。
现在,根据在线教程,我将实际的连接变量存储在文件的全局变量中,并将导出结果转换为一个函数,该函数检查上述连接对象是否不是null
,如果是,返回它而不创建新的连接。如果确实是null
,则它将创建一个连接并将createConnection
的结果分配给该变量,并返回该变量。
当然,我需要将db
的所有用法转换为db()
,因为它现在是一个函数。在文件中添加的日志表明,在第一个连接之后,对db
的所有后续调用确实已重新使用该连接。
然后,我将db
转换为IIFE并返回到正常的输出。我想象过,与其将所有用法替换为一个函数调用,不如最好在文件中调用它,然后将其导出。
但是现在,发生的事情很奇怪。第一次调用表明正在创建一个新的连接。 (=> Creating a new database connection
)。但是,在随后的调用中,不会输出任何日志语句。理想情况下,是否不应该在控制台上打印(=> Reusing an existing connection
?我想由于没有出现第一个日志,所以连接仍在重用,但是为什么会出现这种现象?
我知道它与require
d或缓存模块的方式以及AWS Lambda如何处理JS模块有关。任何进一步的见解都会有所帮助。
let connection: mongoose.Connection | null = null;
let isPreviousConnectionAvailable = false;
export const db = (() => {
if (!isPreviousConnectionAvailable) {
log.debug('=> Creating a new database connection.');
connection = mongoose.createConnection(dbConnectionURL, { useNewUrlParser: true });
isPreviousConnectionAvailable = true;
} else {
log.debug('=> Reusing an existing database connection');
}
return connection;
})();
答案 0 :(得分:1)
将不打印日志。由于它是首次导入的,因此随后在容器变热时将访问相同的常量。这是预期的行为。