NodeJS: Heroku ClearDB не закрывает соединения

Я развернул NodeJS API на Heroku и попытался подключить его к базе данных MySQL, поэтому я создал connectionPool для обработки подключений в учетной записи ClearDB ignite (бесплатно), которая позволяет максимум 10 подключений.

Каждый раз, когда я выполняю запрос к базе данных, он просто добавляет новое соединение в стек, пока не достигнет 10 соединений, и приложение не вылетит.

Мой код выглядит следующим образом:

Фабрика подключения:

var mysql = require('mysql');

function createDBConnection() {
    var conn = mysql.createPool({
      host: 'xxx',
      user: 'xxx',
      password: 'xxx',
      database: 'xxx'
    });
    return conn;
}

module.exports = function() {
  return createDBConnection;
}

И вот мой запрос на выбор:

function Dao(connection) {
  this._connection = connection;
}

Dao.prototype.findAll = function (callback) {
  this._connection.query('SELECT * FROM table',
  function(errors, results) {
    callback(errors,results);
  });
};

module.exports = function() {
  return Dao;
}

Наконец, вот маршрут, который я использую для его вызова:

app.get('/products', function (req,res) {
    var connection = app.persistence.connectionFactory();
    var dao = new app.persistence.Dao(connection);

    dao.findAll(function (err, result) {
      res.format({
        json: function () {
          res.json(result);
        }
      });
    });
  });

Я попытался изменить createPool() на createConnection(), а затем вызвать функцию .end()/.destroy() сразу после каждого запроса, но она вообще не работает.

Любые подсказки?


person Marcelo    schedule 02.09.2017    source источник


Ответы (1)


Чтобы закрыть соединение / вернуть соединение с пулом, используйте: connection.release()

var mysql = require('mysql');
var pool  = mysql.createPool(...);

pool.getConnection(function(err, connection) {
  // Use the connection
  connection.query('SELECT something FROM sometable', function (error, results, fields) {
    // And done with the connection.
    connection.release();

    // Handle error after the release.
    if (error) throw error;

    // Don't use the connection here, it has been returned to the pool.
  });
});

mysql: документация по объединению соединений в пул

person EMX    schedule 02.09.2017
comment
Если я добавлю connection.release(), мой код будет выглядеть так: Dao.prototype.findAll = function (callback) { this._connection.query('SELECT * FROM table', function(errors, results) { callback(errors,results); this._connection.release(); }); };. Но затем я получаю следующую ошибку: Error: Connection already released и приложение сразу же вылетает. - person Marcelo; 03.09.2017
comment
это потому, что вы используете то же соединение, которое вы освободили, для выполнения какого-либо действия, или к тому времени, когда вы сами вызываете освобождение, оно уже было освобождено, попробуйте сделать это до обратного вызова, и соединение фактически ссылается на объект, возвращаемый pool.getConnection - person EMX; 03.09.2017
comment
Я пытался вызвать connection.release() перед обратным вызовом, но он продолжает выдавать мне ошибку Connection already released. Вместо этого я попытался использовать connection.destroy(), и локально это действительно разрушает соединение, и все в порядке. Но если я сделаю то же самое на ClearDB, команда destroy() не сработает. Он все равно продолжает складывать соединения! - person Marcelo; 03.09.2017
comment
@ Марсело, почему бы тебе не попробовать более простой подход, просто чтобы проверить connection.release()? Я думаю, что вы используете соединения (открывая их с помощью узла), а не ClearDB - person EMX; 03.09.2017
comment
Что ж, я сделал это. Я создал одно простое приложение с двумя простыми запросами (SELECT/INSERT): открытие, запрос и освобождение соединения внутри одного и того же файла... Я пробовал методы createPool() и createConnection(), но безуспешно. Соединения продолжали накапливаться. В конце концов я отказался от ClearDB и вместо этого попробовал собственный PostgreSQL от Heroku и вуаля. Я заставил его работать без особых усилий, просто адаптировав свои запросы и изменив провайдера подключения с mysql на pg. Поскольку я знаю, что это не решение моей проблемы, а (крайний) обходной путь, я не буду использовать это как ответ на свой вопрос. Тай! - person Marcelo; 04.09.2017