Сохранение подключения MySQL на Express

0

поэтому я совершенно новичок в nodejs и выражаю. Там есть служба, которую я пытаюсь создать, и я заметил, что я не могу просто поддерживать соединение mysql, снова указывая connection.connect(). Поэтому я придумал этот способ продолжения соединения, но я не был уверен, что это правильный способ сохранить соединение. Может ли кто-нибудь из вас взглянуть на прокомментированную часть в середине кода?

app.get('/keyboard', function(req, res){
    connection.connect();
    connection.query("SELECT 'hour' from timetable WHERE 'reserved' = '0'", function(err, rows, fields){

            if(err) throw err;
            var buttons = [];
            for(var i = 0; i < rows.length; i++){

                    buttons.push(rows[i].hour);
            }

            console.log("available time: " + buttons);

            var return_data = {

                    "type"    : "buttons",
                    "buttons" : buttons
            };
            //console.log(return_data);
            res.send(return_data);

    });

    connection.end(); // connection ends here
    //connection.connect() doesn't create a new connection.
    connection = mysql.createConnection({ // another connection like this?
            host     : 'localhost',
            user     : 'user',
            password : 'pw',
            database : 'db'
    });
});
Теги:
express
connection-pooling

2 ответа

1
Лучший ответ

В этом случае вам следует подумать об использовании функций пула, предоставляемых библиотекой mysql. Пул возьмет на себя задачу управления соединениями.

var mysql = require('mysql');
var pool = mysql.createPool({ // another connection like this?
  host: 'localhost',
  user: 'user',
  password: 'pw',
  database: 'db',
  connectionLimit : 10 // its depends on requirement  
});


app.get('/keyboard', function(req, res) {
  pool.query("SELECT 'hour' from timetable WHERE 'reserved' = '0'", function(err, rows, fields) {

    if (err) throw err;

    var buttons = [];
    for (var i = 0; i < rows.length; i++) {
      buttons.push(rows[i].hour);
    }

    console.log("available time: " + buttons);

    var return_data = {

      "type": "buttons",
      "buttons": buttons
    };
    //console.log(return_data);
    res.send(return_data);
  });
})

Вы можете использовать пул, как обычное соединение, разница в том, что модуль mysql будет запрашивать новое соединение из своего пула при каждом вызове объекта пула и освобождать это соединение после завершения запроса.

Это важно, если вам нужно использовать транзакции, если вам нужно сделать несколько запросов на несколько запросов, используемых для каждого состояния соединения. Например, что-то вроде этого может потерпеть неудачу или иметь неожиданное поведение:

pool.query("START TRANSACTION")
pool.query("SELECT ...") // some query
pool.query("COMMIT")

Для такого случая вам нужно будет написать его таким образом, но там вам нужно освободить соединение обратно в пул, используя connection.release();

pool.getConnection(function(err, connection) {
  connection.query("START TRANSACTION")
  pool.query("SELECT ...") // some query
  connection.query("COMMIT", function() {
    connection.release();
  })
});

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

(См. Объединение соединений, для получения более подробной информации)

  • 0
    Спасибо за подробное объяснение! Итак, что вы говорите, если я использую пул, мне не нужно беспокоиться о вызове connection.end() , верно?
  • 0
    @ hklee93 извините, для сценария getConnection необходимо освободить соединение обратно в пул с помощью connection.release(); , Но если вы вызываете только функцию запроса direclty для пула ( pool.query ), вам не нужно использовать release или end .
Показать ещё 1 комментарий
0

Вы можете создать соединение, используя метод опроса, используя модуль npm- node-mysql-pool.

var MySQLPool = require("mysql-pool").MySQLPool;
var pool = new MySQLPool({
  poolSize: 4,// it can be number of connections
  user:     'root',
  password: 'root',
  database: 'test'
});

pool.query("SELECT 'Hello, World!' AS hello", function(err, rows, fields) {
  if(err) throw err;
  console.log(rows[0].hello);
});

for(var i = 0; i < 10; ++i) {
  pool.query("SELECT SLEEP(2), ? AS i", [i], function(err, rows, fields) {
    if(err) throw err;
    console.log("Slept: " + rows[0].i);
  });
}
  • 0
    Если вы не предоставите никакой дополнительной информации, кроме ссылки на другой ответ, то это, скорее всего, комментарий, и вопрос, к которому относится связанный ответ, может быть дубликатом. Кроме того, использование только одного соединения для приложения приведет к снижению производительности при наличии большого количества параллельных запросов к серверу.
  • 0
    Спасибо за новую информацию. Я думаю, что мне нужно взглянуть на объединение немного больше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню