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,http://pastebin.com/2c4pU1K8,http://pastebin.com/2S3301gD logs _ _ _ _

我在实例化一个runnable类的for循环中启动了许多线程(10),但似乎我得到了相同的结果db(我从db中得到一些字符串,然后改变它)但是each thread, I get same string(尽管每个线程都改变了它。)。使用 可能是什么常见的问题jdbcpostgresql

line 252

and line 223

该链接被标记为processed. (true)在 db 中。其他线程crawler class也这样做。所以什么时候line 252应该得到一个链接。它应该是processed = false。但我看到了threads take same link.

当其中一个线程爬取链接时。它使它处理= true。其他人则不应抓取它。(得到它)是它的标记处理=真。


getNonProcessedLinkFromDB()返回未处理的链接

public String getNonProcessedLink(){        line 645
public boolean markLinkAsProcesed(String link){   line 705

getNonProcessedLinkFromDB 将查看已处理 = false 链接并从中提供一个。 limit 1 每个线程的起始间隔为 20 秒。
在一个线程内。1 或 2 秒(估计抓取的处理时间)

line 98  keepS threads from grabbing the same url

如果你看到结果。一个线程使它成为现实。还有其他人访问它。过了一段时间。

所有线程都是分开的。甚至一个races。db在第一个线程处理它的那一刻使链接为真

4

2 回答 2

2

这是一个不简洁的问题被问到的情况。里面有很多代码,不知道发生了什么。您需要将其分解,以便您了解哪里出了问题,然后向我们展示这一点。

一些潜在冲突的事情。

  • 您正在为几乎每个进程打开一个数据库连接。应用程序的正常流程是打开几个连接,进行一些处理,然后关闭它们。
  • 你在处理数据库提交吗?我不记得 postres 数据库的默认设置是什么,您必须查看它。
  • 单个 url 有 3 种状态。未处理、​​正在处理、已处理。我认为您根本没有处理“正在处理”状态。因为处理需要时间并且可能会失败,所以您必须考虑这些情况。

我没有阅读日志,因为它们对我没用。

-编辑评论-数据库通常有事务。在提交之前,您在一个事务中所做的修改不会在其他事务中看到。事务可以回滚。您需要查看获取刚刚更新的行并查看该值是否真的发生了变化。在另一个事务或另一个连接上执行此操作。

20 秒的间隔看起来只是在进程启动时。想象一下Thread1处理URL1Thread2处理URL2的情况。他们几乎在同一时间完成。他们都寻找下一个未处理的 URL(比如URL3)。他们都会开始处理这个 Url,因为他们不知道另一个线程已经启动了它。您需要一个分发 URL 的进程,可能是您想要查看的队列。

如果您知道哪些线程正在处理哪些 URL,则可能会改进日志记录。您还需要较小的样本量,以便您了解正在发生的事情。

于 2013-09-11T14:59:14.767 回答
0

尽管这篇文章中助手的评论和回应也是正确的。

在 crawl() 方法体的开头。

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

在 crawl() 方法体的底部(当它完成处理时):

    crawl(nonProcessedLinkFromDB);

实际上解决了这个问题。

这是将链接标记为已处理和获取新链接以及让其他线程在当前正在处理该链接时获得相同链接之间的差距。

Synchonized block进一步帮助。

感谢帮手。IRC 频道上的“Fuber”。Quakenet 服务器 #java 和 Freenode 服务器 ##javaee

和所有支持我的人!

于 2013-09-11T21:54:15.980 回答