Status: solved
行番号を指摘しなければならなかったので、ペーストビンを作成する必要がありました。
注: executorsService またはスレッド プールは使用しません。このようにスレッドを開始して使用することの何が問題なのかを理解するだけです。1つのスレッドを使用する場合。アプリは完璧に動作します!
関連リンク:
http://www.postgresql.org/docs/9.1/static/transaction-iso.html http://www.postgresql.org/docs/current/static/explicit-locking.html
main app,
http://pastebin.com/i9rVyari
logs
、http://pastebin.com/2c4pU1K8、http://pastebin.com/2S3301gD
クラスをインスタンス化してforループで多くのスレッド(10)を開始していますが、 (dbから文字列を取得してから変更しています)runnable
から同じ結果が得られているようですが、 (各スレッドが変更したにもかかわらず)。 通常の問題と思われるものに使用しますか?db
each thread, I get same string
jdbc
postgresql
line 252
and line 223
processed. (true)
リンクはdbのようにマークされています。の他のスレッドcrawler class
もそれを行います。そのため、いつline 252
リンクを取得する必要があります。である必要がありますprocessed = false
。しかし、私はすべてを見るthreads take same link.
スレッドの 1 つがリンクをクロールしたとき。処理済み = true にします。他の人はそれをクロールすべきではありません。(取得) は、マークされた処理済み = true です。
getNonProcessedLinkFromDB()
未処理のリンクを返します
public String getNonProcessedLink(){ line 645
public boolean markLinkAsProcesed(String link){ line 705
getNonProcessedLinkFromDB
は、処理済み = false のリンクを見て、そのうちの 1 つを提供します。 limit 1
各スレッドには、20 秒の開始間隔ギャップがあります。
1 つのスレッド内で。1 ~ 2 秒 (クロールの処理時間の見積もり)
line 98 keepS threads from grabbing the same url
結果を見れば。1つのスレッドがそれを実現しました。さらに他の人がそれにアクセスします。しばらくしてから。
すべてのスレッドは別です。一つでもraces
。データベースは、最初のスレッドがそれを処理する瞬間にリンクを真にします