2017-09-02 1 views
2

Ich habe eine NodeJS-API auf Heroku und versuchte, es mit einer MySQL-Datenbank zu verbinden, so habe ich einen ConnectionPool für die Handhabung von Verbindungen auf einem ClearDB ignite account (kostenlos) erstellt, die maximal 10 erlaubt Verbindungen.NodeJS: Heroku ClearDB nicht schließen Verbindungen

Jedes Mal, wenn ich eine Abfrage an die Datenbank führe, fügt sie einfach eine neue Verbindung zum Stapel hinzu, bis sie 10 Verbindungen erreicht und die App abstürzt.

Mein Code ist wie folgt:

connection:

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; 
} 

Und hier ist meine Auswahlabfrage:

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; 
} 

Schließlich ist hier der Weg, den ich verwende es zu nennen:

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); 
     } 
     }); 
    }); 
    }); 

Ich habe versucht, createPool() zu createConnection() zu ändern und dann die Funktion .end() /. Destroy() direkt nach jeder Abfrage aufzurufen, aber es funktioniert überhaupt nicht.

Irgendwelche Hinweise?

Antwort

0

Um eine Verbindung/Return eine Verbindung zur Poolbenutzung schließen: 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

Wenn ich hinzufügen connection.release() mein Code sieht wie folgt aus: 'Dao.prototype.findAll = Funktion (Rückruf) { this._connection.query ('SELECT * FROM table', Funktion (Fehler, Ergebnisse)) { Rückruf (Fehler, Ergebnisse); this._connection.release(); }); }; '. Aber dann bekomme ich den folgenden Fehler: "Fehler: Verbindung ist bereits freigegeben" und die App stürzt sofort ab. – Marcelo

+0

Dies liegt daran, dass Sie dieselbe Verbindung verwenden, die Sie für bestimmte Aktionen freigegeben haben, oder wenn Sie das Release selbst aufrufen, wurde es bereits freigegeben. Versuchen Sie es vor dem Rückruf, und die Verbindung bezieht sich tatsächlich auf das von 'pool zurückgegebene Objekt .getConnection' – EMX

+0

Ich habe versucht, connection.release() vor dem Callback anzurufen, aber es hält mich 'Connection bereits freigegeben' Fehler. Ich habe versucht, 'connection.destroy()' stattdessen und ** lokal ** es wirklich zerstört die Verbindung und alles ist in Ordnung. Aber wenn ich genau dasselbe mit ClearDB mache, scheint der Befehl 'destroy()' nicht zu funktionieren. Es stapelt trotzdem Verbindungen! – Marcelo