2012-10-30 11 views
5

Beni deli yapan bir davranışla karşılaştım ve çözemiyorum.Node.js + libmysql-client + pingSync + setInterval = baş ağrısı (true);

Birkaç MySQL bağlantıları açılır ve onları bir diziye depolayan bir komut dosyası var. MySQL'in kullanılmayan bağlantıları kapatmasını engellemek için (işlemin 7/24 çalıştırılması gerekiyor) pingSync() öğesini sık sık ateşlemek için setInterval kullanıyorum. Bu yaklaşım benim için başka bir projede aylarca çalıştı, ancak 0.8.14 düğümlü yeni bir sunucuda davranış tuhaf.

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

Beklenen sonuç:

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

aldığım sonuçlar:

# 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

ya da benim fonksiyonun, parçaları - - rastgele sırayla iki kez idam
--------------------------------------------------------- 
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 
--------------------------------------------------------- 
--------------------------------------------------------- 

Benim fonksiyonu gibi görünüyor.

Bu davranışa neyin neden olabileceği hakkında bir fikri olan var mı? Ya da bu karışıklık sebebini nasıl izleyeceğinize dair herhangi bir tavsiye? Bazen beklenen sonucu yukarıda anladım ... ama çoğu zaman karışık sonuçları elde ediyorum.

DÜZENLEME: setInterval() işlevleri yalnızca bir kez çağrılır!

+0

sorunuzun köküne hakkında emin değil, ancak [jenerik havuzu] (https://github.com/coopernurse/node-pool) sizin MySQL kurulum/devrelerde tamamını yönetmek için böyle bir şey kullanmayı düşünebilirsiniz Bağlantıları otomatik olarak - ilk etapta 4 bağlantıyı sürdürmek zorunda kalmadan bu şekilde özgürsünüz. :) – Beau

+0

Sadece size bir cevap verdim çünkü sorunuzu değerlendirdiğimde güldüm. Soruların standart bir sözdizimi olması gerektiğini düşünüyorum. eğer (siz == katılıyorum) {dönüş lol; } – neutron

cevap

0

Ben setInterval bazen beklenmedik bir şekilde şeyler yürütür o geçmişte yaşamış (ı onlarca kez bunu kontrol ettik). İşlev, örneğin setInterval'dan daha uzun çalıştırılıyorsa. Bunun için basit bir düzeltme bunun yerine setTimeout'u kullanmak ve işlevinizin sonunda yeniden ayarlamaktır.

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

Bunu yapmayı deneyin ve yardımcı olup olmadığını görün.