2015-09-18 2 views
1

Я разрабатываю приложение узла с ExpressJS и MySQL. Я работаю с этим модулем https://github.com/felixge/node-mysql/, и я изучаю его использование. Я получаю неприятности о том, как правильно закрыть соединения.Закрыть соединение MySQL Node.js

Это то, что я делаю:

app.post('/example', function (req, res) { 

    //BD 
    var connection = mysql.createConnection({ 
     host: config.database.host, 
     port: config.database.port, 
     user: config.database.user, 
     password: config.database.password, 
     database: config.database.database 
    }); 

    var sql = ''; 

    if (varExample != null) { 

     sql = 'Random query'; 

     connection.query(sql, function (err, results) { 

      //Get results 

      connection.end(); 
     }); 
    } 
}); 

И иногда я должен вызвать этот метод несколько раз, чтобы вставить данные в БД. В этот момент я получаю сообщение об ошибке «Слишком много соединений».

Как закрыть соединение в этих случаях?

ответ

4

Что вы не должны делать, так это открывать соединение каждый раз, когда вы получаете запрос. Он медленно подключается каждый раз, во-вторых, драйвер обычно открывает пул соединений для вас, поэтому не должно быть проблемой. Нет необходимости закрывать соединение с mysql.

В принципе вы должны сделать это

//BD 
var connection = mysql.createConnection({ 
    host: config.database.host, 
    port: config.database.port, 
    user: config.database.user, 
    password: config.database.password, 
    database: config.database.database 
}); 
app.post('/example', function (req, res) { 
    var sql = ''; 

    if (varExample != null) { 

     sql = 'Random query'; 

     connection.query(sql, function (err, results) { 

      //Get results 
     }); 
    } 
}); 

EDIT: Добавить вариант пула Имея пул соединений, в основном то, что большинство из нас хочет для сервера, который должен сделать много запросов. немного изменилось, как вы создаете соединение.

var connection = mysql.createPool({ 
    connectionLimit : 10, 
    host   : 'example.org', 
    user   : 'bob', 
    password  : 'secret' 
}); 
+0

С этим решением проблемы. В случае, когда я повторно использую одно и то же соединение, чтобы делать разные запросы. «Ответы на узел» не могут вставлять запрос после вызова «quit» – Ulyarez

+0

SOrry, вам нужно удалить 'connection.end()' – DevAlien

+0

. Возможно, это глупый вопрос, но как работает Node закрыть соединение после запроса? – Ulyarez

2

Я понимаю, что есть уже принят ответ, но то, что вы действительно должны делать это создание пула базы данных, которые другие ответы действительно не дают пример. Вы должны установить это немного иначе, чем создать обычное соединение с базой данных с библиотекой.

-edit Вам не нужно беспокоиться о закрытии соединений.

var mysql = require('mysql'); 
    var pool = mysql.createPool({ 
     connectionLimit : 10, 
     host   : 'example.org', 
     user   : 'bob', 
     password  : 'secret' 
    }); 

    pool.query('SELECT 1 + 1 AS solution', function(err, rows, fields) { 
     if (err) throw err; 

     console.log('The solution is: ', rows[0].solution); 
    }); 

exports.Pool = pool; 
Смежные вопросы