Когда закрывать подключение к базе данных Oracle в nodejs?

#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 . Я пытаюсь закрыть соединение в централизованном месте, чтобы где-то не пропустить закрытие.