2014-02-12 8 views
7

Ich verwende den node-mysql Treiber mit Verbindungspooling.node-mysql - Wann die Verbindung zurück in den Pool freigeben

Lösen der Verbindung wieder in den Pool, wenn es nur eine Abfrage ist, ist einfach:

pool.getConnection(function(err, connection) { 
    if (err) { 
    throw err; 
    } 

    query = "SELECT * FROM user WHERE id = ?"; 
    connection.query(query, [id], function(err, users) { 
    connection.release(); 

    if (err) { 
     throw err; 
    } 

    // ... 
    }); 
}); 

Was passiert, wenn ich die Verbindung ein zweites Mal verwenden? Ich müsste die release() ein paar Zeilen nach unten verschieben. Aber was passiert, wenn der Fehler ausgelöst wird? Wird die Verbindung nie in den Pool zurückgegeben?

Muss ich einen Kontrollfluss lib verwenden, um einen "letzten" Moment zu haben, in dem ich ihn freigeben könnte?
Irgendwelche besseren Ideen?

+2

Hmm. Wirklich gute Frage! Hab mich gedacht. Handle das Release in jedem Fehler Callback? – Zlatko

+0

@Zlatko das ist, was ich dachte, da diese Verbindung nie in den Pool zurückgekehrt ist, wenn der Fehler –

Antwort

3

Ein Weg, wie dies behandelt werden könnte, ist Versprechen. Da Sie ein Pool Gebäude sind, können Sie Ihre Anfragen mit so etwas wie q (oder native Versprechen, in Kürze) konstruieren:

// assuming you have your local getConnection above or imported 
exports.getConnection = function(queryParams) { 
    var d = q.defer(); 
    local.getConnection(function(err, conn) { 
     if(err) d.reject(err); 
     d.resolve(conn); 
    }); 
}); 

So wickeln einige Ihrer anderen Anrufe in Versprechungen so und dann einfach zusammenstellen Abfrage:

db.getConnection() 
.then(function(conn){ 
    makeRequest() 
    .then(...) 
    ... 
.catch(function(err){ 
    // at the end you release the conn 
}); 

Scheint es wie etwas, das Sie verlangen?

+0

schlagen, das ist, was ich endete - aber mit Versprechungen und Generatoren. Danke, dass Sie mich in die richtige Richtung weisen. – pkyeck

+0

Warten Sie, würde dies nicht nur die Verbindung freigeben, wenn ein Fehler ausgelöst wurde, da Sie im catch-Block freigeben? Willst du das nicht tun? .finally (function() {conn.release();} '?? – PixMach

+0

Oh, das kannst du tun, ich dachte, du könntest die Verbindung im' makeRequest' freilassen, aber endlich wäre viel besser. – Zlatko

1

Wenn Sie eine MySQL-Abfrage ausführen, wird die Datenbank für diese Zeit gesperrt, bis die Abfrage abgeschlossen ist. Nach dem erfolgreichen Abschluss der Abfrage gibt es diese Datenbanksperre frei.

Gleicher Fall hier: connection.release(); löst einfach die DB-Verbindung, sonst nichts.

0

Sie sollten separate Verbindungen für diese Situation verwenden. Dafür ist der Verbindungspool gedacht. Auf diese Weise muss man nicht warten, bis der andere fertig ist, bevor er starten kann. Ich verwende nur die gleiche Verbindung, wenn eine Abfrage nicht gestartet werden kann, bis die andere Abfrage beendet ist.

Verwandte Themen