Webクローラーの多くのインスタンスを並行して実行しています。
各クローラーはテーブルからドメインを選択し、その URL と開始時刻をログ テーブルに挿入してから、ドメインのクロールを開始します。
他の並列クローラーは、ログ テーブルをチェックして、クロールする独自のドメインを選択する前に、既にクロールされているドメインを確認します。
別のクローラーが選択したばかりでまだログ エントリがないドメインを、他のクローラーが選択しないようにする必要があります。これを行う方法についての私の最善の推測は、1 つのクローラーがドメインを選択し、ログ テーブルに行を挿入している間 (2 つのクエリ)、他のすべての読み取り/書き込みからデータベースをロックすることです。
どうやってこれを行うのですか?残念ながら、これは非常に複雑で、他の多くのものに依存しています。私が始めるのを手伝ってください。
このコードは良い解決策のようです (ただし、以下のエラーを参照してください)。
INSERT INTO crawlLog (companyId, timeStartCrawling)
VALUES
(
(
SELECT companies.id FROM companies
LEFT OUTER JOIN crawlLog
ON companies.id = crawlLog.companyId
WHERE crawlLog.companyId IS NULL
LIMIT 1
),
now()
)
しかし、次のmysqlエラーが発生し続けます:
You can't specify target table 'crawlLog' for update in FROM clause
この問題なしで同じことを達成する方法はありますか? 私はいくつかの異なる方法を試しました。これを含む:
INSERT INTO crawlLog (companyId, timeStartCrawling)
VALUES
(
(
SELECT id
FROM companies
WHERE id NOT IN (SELECT companyId FROM crawlLog) LIMIT 1
),
now()
)