2017-09-02 108 views
2

我在Heroku上部署了一个NodeJS API,并试图将它连接到MySQL DB,因此我创建了一个用于处理ClearDB点火帐户(免费)连接的connectionPool,它允许最多10个连接。NodeJS:Heroku ClearDB未关闭连接

每次我对数据库执行查询时,它都会向堆栈添加一个新连接,直到它达到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()函数,但它根本不起作用。

任何提示?

回答

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 : Pooling connections Documentation

+0

如果我添加connection.release()我的代码看起来是这样的:'Dao.prototype.findAll =函数(回调){ this._connection.query('SELECT * FROM table', function(errors,results){ callback(errors,results); this._connection.release(); }); };'。但后来我得到以下错误:'错误:连接已经释放'和应用程序立即崩溃。 – Marcelo

+0

这是因为您使用的是与您发布的相同连接来执行某些操作,或者在您自己调用该版本时它已经被释放,请尝试在回调之前执行该操作,而连接实际上是指由'pool返回的对象.getConnection' – EMX

+0

我试着在回调之前调用connection.release(),但它一直给我'Connection already released'错误。我尝试使用'connection.destroy()'而不是**本地**它真的破坏了连接,一切都很好。但是如果我在ClearDB上做同样的事情,命令'destroy()'似乎不起作用。无论如何它始终保持堆叠连接! – Marcelo