我经历过让我疯狂的行为,我无法解决。
我有一个脚本打开一些mysql连接并将它们存储在一个数组中。为了防止MySQL关闭未使用的连接(该进程应该全天候运行),我使用setInterval频繁地触发pingSync()。 这种方法在我的另一个项目中已经工作了好几个月,但在节点为0.8.14的新主机上,这种行为很奇怪。
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);
预期结果:
---------------------------------------------------------
Length:
4
PING mysql 0 / 1351603868929
true
PING mysql 1 / 1351603868929
true
PING mysql 2 / 1351603868929
true
PING mysql 3 / 1351603868929
true
---------------------------------------------------------
我得到的结果:
#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
---------------------------------------------------------
---------------------------------------------------------
看起来我的函数 - 或者我的函数的一部分 - 以随机顺序执行两次。
有没有人知道什么可能导致这种行为?或者任何建议如何追查这个烂摊子的原因? 有时我会得到上面引用的预期结果......但大多数时候我得到了混合的结果。
编辑:setInterval()函数只调用一次! (我已经检查了几十次)
答案 0 :(得分:0)
我过去经历过setInterval有时会以意想不到的方式执行事情。例如,如果函数运行的时间超过了为setInterval设置的时间。一个简单的解决方法是使用setTimeout,并在函数结束时再次设置它。
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();
尝试这样做,看看是否有帮助。