2013-05-24 1 views
4

Я пишу приложение nodejs и хочу использовать пул соединений.Приложение не заканчивается пулом MySQL

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

Приложение работает нормально, если я использую одно соединение вместо бассейна. Нужно ли мне каким-то образом прекратить пул?

Библиотека используется: https://github.com/felixge/node-mysql
Node.js версия: 0.10.4 на Ubuntu

var mysql  = require('mysql'); 
var pool = mysql.createPool({ 
    host  : 'example.org', 
    user  : 'myuser', 
    password : 'youbet', 
    database : 'notrevealingdetails', 
    insecureAuth: true 
}); 

function getCampaignData(callback) 
{ 
    pool.getConnection(function(err, connection) { 
     if(err) throw err; 

     connection.query(
      'SELECT cam.id, cam.name AS campaign_name, cam.subdomain, usr.email, usr.display_name AS user_displayname ' + 
      'FROM campaigns AS cam INNER JOIN users AS usr ON usr.id = cam.user_id ' + 
      'WHERE cam.state=2', 
      function(err, rows) { 
       callback(err, rows,connection); 
       //console.log('called end()'); 
     }); // callback function for connection.query 
    }); // end pool.GetConnection 
} 

getCampaignData(function(err, rows, connection) { 
    if (err) throw err; 


    connection.end(); 
    console.log("I expect my app to terminate"); 
}); 
+0

Попробуйте использовать connection.destroy() вместо – spotirca

+0

@spotirca 'connection.destroy()' будет (в соответствии с документацией) убить соединение. Если я это сделаю, нет смысла использовать пул в первую очередь - не так ли? (** Но это работает **) – yas4891

+0

И «работает» Я имею в виду: приложение завершается. Мне все еще нужен способ заставить пул работать – yas4891

ответ

3

У меня была очень такая же проблема, но, глядя на исходный код https://github.com/felixge/node-mysql/blob/master/lib/Pool.js Я нашел что пул, по крайней мере, в его текущей реализации, имеет метод end(), который поворачивает конец вызова() для всех соединений.

Он также принимает функцию обратного вызова, вызываемую после того, как все соединения фактически завершены (или всякий раз, когда возникает ошибка).

pool.end(function (err) { 
    if (err) console.error("An error occurred: " + err); 
    else console.log("My app terminated"); 
}); 
0

Я хотел бы использовать

getCampaignData(function(err, rows, connection) 
{ 
    if (err) throw err; 
    connection.release(); 
    console.log("I expect my app to terminate"); 
});