Как обеспечить вызов connection.end() при получении подключения к базе данных из пула

Мы используем node-mysql, и я предоставляю createPool для mysql, где из любого файла мы можем запросить файл базы данных и получить такое соединение.

var db = ("./database");

db(function(err, connection) {
   //use connection to do stuff
}

Я заметил, что люди не всегда забывают вызвать connection.end(), чтобы вернуть соединение в пул, и тогда мы достигнем предела..

Как я могу спроектировать получение соединения, чтобы независимо от того, когда они решат завершить функцию обратного вызова, вызываемую connection.end()? Я не могу найти способ сделать одно место, где мы могли бы это сделать, поэтому разработчики озабочены только подключением.


person Tolga E    schedule 27.06.2013    source источник


Ответы (1)


Я не знаю createPool из mysql, но нельзя ли просто обернуть его?

Люди предоставят function stuff(err, connection) { ... do whatever they want ... }. Почему бы вам не взять эту функцию и не создать save_stuff-функцию? Что-то вроде

function save_stuff_creator(stuff) {
    return function(err, connection) { stuff(err, connection); connection.end() }
}

Возможно, вы захотите немного try..catch вокруг stuff()-звонка.

Если вы хотите, чтобы connection оставался с кем-то для некоторых других обратных вызовов, вы можете изменить функцию на что-то вроде stuff(connection, callback) и использовать модуль, такой как async, и series-Object.

Но я понятия не имею, как обеспечить окончательный вызов connection.end(), если вы хотите дождаться окончания «пользовательского потока»: на самом деле это проблема. Такого потока нет, и нет способа выяснить, какое событие в цикле событий от кого исходит. Насколько я знаю, цикл событий не доступен для js-разработчика.

Если вы не можете доверять своему вызываемому объекту, возможно, вы можете поместить его код в дополнительный дочерний узел (см. модуль cluster). Таким образом, у вас есть немного контроля: когда дочерний элемент завершает работу, вы получаете уведомление.

person CFrei    schedule 28.06.2013