3

データを保存し、数分ごとに URL にリクエストを送信するために MySQL を使用しています。

URL テーブルは 1 回照会され、setInterval() を使用して毎分 sendRequest 関数を実行することにより、各要求が再送信されます。

問題は、URL がデータベースから削除された場合でも、各リクエストの前にデータベースにクエリを実行していないため、リクエストを送信し続けることです (そして、私の関数はレコードが削除されたことを知りません)。

また、各リクエストの前に関連するデータベース レコードをクエリしたくありません。

したがって、1 分ごとに 1 回データベースにクエリを実行して、削除されたすべてのレコードと、削除されたレコードを clearInterval で検索します。そのため、各レコードに対して毎分クエリを実行する必要はありませんが、更新されたレコードに対して毎分 1 回だけクエリを実行する必要があります (URL が 100 万ある場合、毎分 100 万クエリではなく、毎分 1 クエリになります)。

しかし、クエリで、データベース レコード 1、3、および 6 が削除されたことがわかりました。どうすればそれらだけを clearInterval できますか?

4

3 に答える 3

1

私はそれをこのように解決したようです:

setInterval(url6、url5 ..などの変数名を使用)を次のように定義しました

global ['url' + urlID] =setInterval....。

また、毎分更新されたレコードクエリを使用して、定義されたレコードに対してclearIntervalと呼ばれます。

clearInterval(global ['url' + urlID]);

質問をしている間、私は実際に@juandopazoと@Georgeの両方が提案したようなスキーマを探していて、それが最初の答えだったので@juandopazoの答えを受け入れました。どうもありがとうございました。

于 2013-01-14T16:21:34.950 に答える
1

レコード ID にリンクされたタイムアウト ID をオブジェクトに保存できます。

var recordIntervals = {};

recordIntervals[recordId] = setInterval(queryRecordId, time);

しかし、それはおそらく良い考えではありません。毎分 1 つの間隔だけを実行し続け、データベースにクエリを実行してから、データベースから提供された URL にリクエストを送信します。

setInterval(function () {
  var urls = db.query('SELECT * from URLs');
  urls.forEach(function (url) {
    sendRequest(url);
  });
}, oneMinute);
于 2013-01-14T16:05:46.710 に答える
0

2 つの配列 (または 2 つの配列を持つ json の配列) を使用できます。1 つは URL を保存するため、もう 1 つは間隔を保存するためです。

例 1

nrRequests = 1;
urls[nrRequests] = url;
requests[nrRequests] = setInterval(function(){},1000);
nrRequests++;

例 2

var requests = [];
var interval = setInterval...
var url = get url..
requests.push({
   interval : interval,
   url: url
});

///削除された URL: URL を検索してインデックスを見つけ、その後、リクエストに設定された間隔をクリアします [nrRequests]

for(var item in requests)
{
    if(requests[item][url]==deletedurl)
    {
        clearInterval(requests[item][interval]);
        delete requests[item];
    }
}
于 2013-01-14T15:59:47.790 に答える