【问题标题】:NodeJS: Heroku ClearDB not closing connectionsNodeJS:Heroku ClearDB 没有关闭连接
【发布时间】:2018-02-11 09:43:03
【问题描述】:

我在 Heroku 上部署了 NodeJS API 并尝试将其连接到 MySQL DB,因此我创建了一个 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() 函数,但它根本不起作用。

有什么提示吗?

【问题讨论】:

    标签: mysql node.js heroku cleardb


    【解决方案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 : Pooling connections Documentation

    【讨论】:

    • 如果我添加 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 并且应用程序立即崩溃。
    • 那是因为你正在使用你释放的同一个连接来执行一些操作,或者当你自己调用发布时它已经被释放了,在回调之前尝试这样做,连接实际上是指到pool.getConnection返回的对象
    • 我尝试在回调之前调用 connection.release() ,但它一直给我Connection already released 错误。我尝试改用connection.destroy(),而 locally 它确实破坏了连接,一切都很好。但如果我在 ClearDB 上做同样的事情,destroy() 命令似乎不起作用。无论如何,它一直在堆叠连接!
    • @Marcelo,你为什么不尝试一种更简单的方法来测试connection.release()?我认为这是您使用连接的方式(使用节点打开它们)而不是 ClearDB
    • 好吧,我做到了。我用两个简单的查询(SELECT/INSERT)创建了一个简单的应用程序:在同一个文件中打开、查询和释放连接...我尝试了 createPool() 和 createConnection() 方法,但没有成功。连接不断堆积。最后我放弃了使用 ClearDB 并尝试了 Heroku 自己的 PostgreSQL,然后瞧。我毫不费力地让它工作,只是调整我的查询并将我的连接提供程序从mysql更改为pg。我知道这不是我的问题的解决方案,而是一个(极端)解决方法,我不会用它来回答我的问题。泰!
    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 2019-06-26
    • 1970-01-01
    • 2018-08-20
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多