2012-10-30 9 views
5

Doświadczyłem zachowania, które doprowadza mnie do szału i nie mogę go rozwiązać.Node.js + libmysql-client + pingSync + setInterval = headache (true);

Mam skrypt, który otwiera kilka połączeń mysql i przechowuje je w tablicy. Aby uniemożliwić MySQL zamykanie nieużywanych połączeń (proces powinien działać 24/7), używam setInterval do częstego uruchamiania pingSync(). To podejście sprawdziło się przez wiele miesięcy w innym projekcie, ale na nowym hoście z węzłem 0.8.14 zachowanie jest dziwne.

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

Oczekiwany wynik:

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

Wyniki uzyskałem:

# 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 
--------------------------------------------------------- 
--------------------------------------------------------- 

Wygląda na to, że moja funkcja - lub jej części - zostanie wykonana dwukrotnie w kolejności losowej.

Czy ktoś ma pomysł, co może spowodować to zachowanie? Lub jakiejkolwiek porady, jak wytropić przyczynę tego bałaganu? Czasami dostaję oczekiwany wynik przytoczony powyżej ... ale większość razy uzyskuję mieszane wyniki.

EDYCJA: Funkcja setInterval() jest wywoływana tylko raz! (Sprawdziłem to kilkadziesiąt razy)

+0

Nie jestem pewien co do źródła twojego pytania, ale możesz rozważyć użycie czegoś takiego jak [ogólna pula] (https://github.com/coopernurse/node-pool) aby poradzić sobie ze wszystkimi ustawieniami/rozłączeniem twojego MySQL połączenia automatycznie - w ten sposób jesteś wolny od konieczności utrzymywania 4 połączeń w pierwszej kolejności. :) – Beau

+0

Po prostu musiałem dać ci upomnienie, ponieważ kiedy oceniłem twoje pytanie, zaśmiałem się. Myślę, że powinna istnieć standaryzowana składnia pytań. if (you == agree) {return lol; } – neutron

Odpowiedz

0

Doświadczyłem już w przeszłości, że setInterval czasami wykonuje rzeczy w nieoczekiwany sposób. Jeśli funkcja działa dłużej niż na przykład setInterval. Prostą poprawką byłoby użycie setTimeout i ustawienie go ponownie na końcu funkcji.

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

Spróbuj to zrobić i sprawdź, czy to pomaga.

Powiązane problemy