Node.js + libmysql-client + pingSync + setInterval =头痛(true);

时间:2012-10-30 13:46:24

标签: mysql node.js

我经历过让我疯狂的行为,我无法解决。

我有一个脚本打开一些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()函数只调用一次! (我已经检查了几十次)

1 个答案:

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

尝试这样做,看看是否有帮助。