5

私は私を狂わせる行動を経験しました、そして私はそれを解決することができません。

いくつかのmysql接続を開き、それらを配列に格納するスクリプトがあります。MySQLが未使用の接続を閉じるのを防ぐために(プロセスは24時間年中無休で実行されているはずです)、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
---------------------------------------------------------
---------------------------------------------------------

私の関数(または関数の一部)がランダムな順序で2回実行されるようです。

誰かがこの行動を引き起こす可能性のある考えを持っていますか?または、この混乱の原因を突き止める方法についてアドバイスはありますか?上で引用した期待どおりの結果が得られることもありますが、ほとんどの場合、さまざまな結果が得られます。

編集:setInterval()関数は一度だけ呼び出されます!(私はそれを何十回もチェックしました)

4

1 に答える 1

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

それを試してみて、それが役立つかどうかを確認してください。

于 2013-02-05T11:45:01.740 に答える