NodeJS:Heroku ClearDB未关闭连接

3
我在Heroku上部署了一个NodeJS API,并尝试将其连接到MySQL数据库。为此,我创建了一个连接池来处理ClearDB ignite帐户上(免费)的连接,该帐户最多允许10个连接。

每次执行数据库查询时,它只会将新连接添加到堆栈中,直到达到10个连接,并使应用程序崩溃。

我的代码如下:

connectionFactory:

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()函数,但这根本不起作用。有什么提示吗?
1个回答

0

为了关闭连接/将连接返回到池中,请使用: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:连接池文档


如果我添加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,应用程序会立即崩溃。 - Marcelo
这是因为您正在使用已释放的连接执行某些操作,或者在您自己调用释放之前它已经被释放了。尝试在回调之前进行释放,并且连接实际上是指pool.getConnection返回的对象。 - EMX
我尝试在回调函数之前调用connection.release(),但它一直给我Connection already released错误。我尝试使用connection.destroy()代替,在本地它确实销毁了连接,一切都很好。但是如果我在ClearDB上做完全相同的事情,命令destroy()似乎不起作用。它仍然会堆叠连接! - Marcelo
1
@Marcelo,为什么不尝试一个更简单的方法来测试 connection.release()?我认为问题是你使用连接方式的问题(使用node打开它们),而不是ClearDB的问题。 - EMX
我做到了。我创建了一个简单的应用程序,其中包括两个简单的查询(SELECT/INSERT):打开、查询和释放连接都在同一个文件中... 我尝试过createPool()和createConnection()方法,但都没有成功。连接一直堆积。最后,我放弃了使用ClearDB,转而尝试Heroku自己的PostgreSQL,然后voilá。我只需调整我的查询并将连接提供程序从mysql更改为pg,就轻松解决了问题。我知道这不是我的问题的解决方案,而是(极端)变通的方法,所以我不会将其用作答案。谢谢! - Marcelo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接