У меня есть лямбда-функция, которая подключается к экземпляру MongoDB, и добавляю логику повторного использования пула соединений, чтобы при повторном использовании 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;
})();