2017-09-02 3 views
2

HerokuにNodeJS APIをデプロイしてMySQL DBに接続しようとしたため、ClearDBの着信アカウント(無料)で接続を処理するconnectionPoolを作成しました。接続。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'、 関数(エラー、結果){ コールバック(エラー、結果); this._connection.release(); }); }; '。しかし、私は次のエラーを受け取ります: 'Error:Connection already released'とアプリがすぐにクラッシュします。 – Marcelo

+0

これは、いくつかのアクションを実行するためにリリースしたのと同じ接続を使用しているため、または自分自身でリリースを呼び出しているときに、コールバックの前に実行してください。接続は実際には 'pool .getConnection' – EMX

+0

私はコールバックの前にconnection.release()を呼び出そうとしましたが、 'Connection already released'エラーを返しています。私は代わりに 'connection.destroy()'を使って試してみました**そして**ローカルに**本当に接続を破壊して、すべてがうまくいきます。しかし、ClearDBで同じことをすると、 'destroy()'コマンドは動作しないようです。それはとにかくスタッキング接続を維持します! – Marcelo

関連する問題