2012-10-30 4 views
5

Ich habe ein Verhalten erlebt, das mich verrückt macht und ich kann es nicht lösen.Node.js + libmysql-Client + pingSync + setInterval = Kopfschmerz (true);

Ich habe ein Skript, das ein paar mysql-Verbindungen öffnet und speichert sie in einem Array. Um zu verhindern, dass MySQL ungenutzte Verbindungen schließt (der Prozess sollte 24/7 laufen), verwende ich setInterval, um pingSync() häufig auszulösen. Dieser Ansatz hat für viele Monate in einem anderen Projekt funktioniert, aber auf einem neuen Host mit Knoten 0.8.14 ist das Verhalten komisch.

setInterval(function() { 
var count = 0; 
console.log('---------------------------------------------------------'); 
console.log('Length: '); 
console.log(connections.length); 
connections.forEach(function(connection){ 
    var res = connection.pingSync(); 
    console.log('PING mysql '+count+ '/'+(new Date().getTime())); 
    console.log(res); 
    count++; 
}); 
console.log('---------------------------------------------------------'); 
}, 50000); 

Erwartetes Ergebnis:

--------------------------------------------------------- 
Length: 
4 
PING mysql 0/1351603868929 
true 
PING mysql 1/1351603868929 
true 
PING mysql 2/1351603868929 
true 
PING mysql 3/1351603868929 
true 
--------------------------------------------------------- 

Die Ergebnisse Ich habe:

# 1

--------------------------------------------------------- 
Length: 
4 
PING mysql 0/1351603868929 
true 
4 
PING mysql 0/1351603868929 
true 
PING mysql 1/1351603868929 
true 
PING mysql 2/1351603868929 
true 
PING mysql 3/1351603868929 
true 
--------------------------------------------------------- 

# 2

--------------------------------------------------------- 
Length: 
4 
PING mysql 0/1351604113400 
4 
PING mysql 0/1351604113400 
PING mysql 1/1351604113400 
PING mysql 2/1351604113400 
PING mysql 3/1351604113400 
--------------------------------------------------------- 
PING mysql 2/1351604113400 
PING mysql 3/1351604113400 
--------------------------------------------------------- 
--------------------------------------------------------- 

Es sieht aus wie meine Funktion - oder Teile meiner Funktion - zweimal in zufälliger Reihenfolge ausgeführt werden.

Hat jemand eine Idee, was könnte dieses Verhalten verursachen? Oder irgendeinen Rat, wie man die Ursache für dieses Durcheinander aufspürt? Manchmal bekomme ich das oben angegebene erwartete Ergebnis ... aber die meisten Male bekomme ich die gemischten Ergebnisse.

EDIT: Die setInterval() Funktionen wird nur einmal aufgerufen! (Ich habe das Dutzende Male überprüft)

+0

Nicht sicher über die Wurzel Ihrer Frage, aber Sie könnten in Erwägung ziehen, etwas wie [generic-pool] (https://github.com/coopernurse/node-pool) zu verwenden, um alle Setup/Teardown von MySQL zu behandeln Verbindungen automatisch - auf diese Weise müssen Sie nicht mehr 4 Verbindungen aufrechterhalten. :) – Beau

+0

Ich musste dir nur eine Aufzählung geben, denn als ich deine Frage bewertet habe, habe ich gelacht. Ich denke, es sollte eine standardisierte Syntax für Fragen geben. if (Sie == stimmen zu) {return lol; } – neutron

Antwort

0

Ich habe es in der Vergangenheit erlebt, dass SetInterval manchmal Dinge auf eine unerwartete Art und Weise ausführt. Wenn die Funktion länger als setInterval ausgeführt wird, zum Beispiel. Eine einfache Lösung wäre, stattdessen setTimeout zu verwenden und am Ende der Funktion erneut zu setzen.

var pingMysql = function() { 
    var count = 0; 

    console.log('---------------------------------------------------------'); 
    console.log('Length: '); 
    console.log(connections.length); 

    connections.forEach(function(connection){ 
    var res = connection.pingSync(); 

    console.log('PING mysql '+count+ '/'+(new Date().getTime())); 
    console.log(res); 

    count++; 
    }); 

    console.log('---------------------------------------------------------'); 
    setTimeout(pingMysql, 50000) 
}; 

pingMysql(); 

Versuchen Sie das und sehen, ob es hilft.