0

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 logshttp://pastebin.com/2c4pU1K8http://pastebin.com/2S3301gD

クラスをインスタンス化してforループで多くのスレッド(10)を開始していますが、 (dbから文字列を取得してから変更しています)runnableから同じ結果が得られているようですが、 (各スレッドが変更したにもかかわらず)。 通常の問題と思われるものに使用しますか?dbeach thread, I get same stringjdbcpostgresql

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データベースは、最初のスレッドがそれを処理する瞬間にリンクを真にします

4

2 に答える 2

0

この投稿のヘルパーによるコメントと応答にもかかわらず、これも正しかったです。

crawl() メソッド本体の開始時。

    synchronized(Crawler.class){
        url = getNonProcessedLinkFromDB();
        new BasicDAO().markLinkAsProcesed(url);
    }

そして、crawl() メソッド本体の下部 (処理が完了したとき):

    crawl(nonProcessedLinkFromDB);

実際に問題を解決しました。

これは、処理済みのリンクを true としてマークしてから、新しいスレッドをフェッチして、現在のスレッドが作業している間に他のスレッドが同じリンクを取得できるようにするまでのギャップでした。

Synchonized blockさらに役立ちました。

ヘルパーのおかげです。IRC チャンネルの「Fuber」。Quakenet サーバー #java および Freenode サーバー ##javaee

そして私を支えてくれたみんな!

于 2013-09-11T21:54:15.980 に答える