#node.js #express #database-connection #node-oracledb
Вопрос:
Я использую приложение Nodejs для подключения 20 тысяч пользователей мобильного приложения к базе данных Oracle. Я создаю пул из 16 соединений при запуске процесса и уничтожаю их при завершении процесса.
Чтобы быть эффективным, я предоставляю подключение к базе данных для каждого запроса в промежуточном программном обеспечении express.
app.use(async function (req, res, next) {
try {
req.db = await oracledb.getConnection({
poolAlias: config.DbPoolAlias,
});
res.on("finish", async () => {
if (req.db) {
await req.db.close();
}
});
res.on("close", async () => {
if (req.db) {
await req.db.close();
}
});
} catch (e) {
next(e);
}
next();
});
Это соединение будет использоваться для выполнения многих операторов SQL одного запроса.
Моя проблема в том, что я не знаю лучшего или правильного способа закрыть соединение и вернуть его обратно в пул соединений.
После документов Nodejs существуют события завершения и закрытия, какое событие следует использовать для закрытия соединения? Я знаю, что неправильно использовать оба, так как драйвер node-oracledb не предоставляет isClosed или isOpened свойств для объекта подключения, чтобы использовать его для использования обоих событий, чтобы быть на 100% уверенным, что соединение закрыто.
Мой главный приоритет-убедиться, что соединение закрыто, что бы ни случилось. Я открыт для решений, отличных от событий объекта ответа.
Комментарии:
1. Почему бы вам не позвонить
req.db.close()
в контроллер, как только вы получите результаты из базы данных? Я имею в видуconst result = req.db.execute(...); req.db.close();
. Это был бы самый быстрый способ освободить соединение обратно в пул.2. Потому что тогда я должен делать это в конце каждого обработчика запроса. Я не хочу этого делать.
3. Вы можете добавить оболочку для
res.json
функции, напримерres._json = res.json; res.json = function(data){ this.req.db.close(); this._json(data); }
, или добавить ее непосредственно в http. Ответ сервера.прототип. Но это всего лишь идея, а не рекомендация.4. Интересная часть проблемы заключается в том, как и когда вы выполняете инструкции SQL. Являются ли они каким-то образом предопределенными? Можете ли вы связать эту последовательность вызовов с подключением/закрытием вызовов? Убедитесь, что соединение закрыто в любых путях ошибок. Используйте статистику пула node-oracledb, чтобы проверить поведение очереди пула и посмотреть, не происходит ли утечка (не закрытие) соединений.
5. @ChristopherJones, Это что-то вроде этого pastebin.com/NVannaHt . Я пытаюсь закрыть соединение в централизованном месте, чтобы где-то не пропустить закрытие.