gpt4 book ai didi

java - 多个线程使用数据库 DAO 类方法获取的相同值

转载 作者:行者123 更新时间:2023-12-02 06:44:59 25 4
gpt4 key购买 nike

状态:已解决

我必须制作一个粘贴箱,因为我必须指出行号。

注意:不使用 executorsService 或线程池。只是为了了解以这种方式启动和使用线程有什么问题。 如果我使用 1 个线程。该应用程序运行完美!

相关链接:

http://www.postgresql.org/docs/9.1/static/transaction-iso.html http://www.postgresql.org/docs/current/static/explicit-locking.html

主应用程序, http://pastebin.com/i9rVyari日志http://pastebin.com/2c4pU1K8 , http://pastebin.com/2S3301gD

我在 for 循环中启动许多线程 (10),实例化一个 runnable 类,但似乎我从 db 得到相同的结果(我得到一些字符串来自数据库,然后更改它)但是对于每个线程,我得到相同的字符串(尽管每个线程都更改了它。)。使用 jdbc 进行 postgresql 可能会出现什么常见问题?

line 252

and line 223

链接被标记为已处理。 (true) 在数据库中。 crawler 类 的其他线程也执行此操作。所以当第252行应该得到一个链接。它应该是processed = false。但我看到所有线程都采用相同的链接。

当其中一个线程抓取链接时。它使它被处理= true。那么其他人就不应该爬行它。 (明白了)它的标记是processed = true。

<小时/>

getNonProcessedLinkFromDB() 返回未处理的链接

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

getNonProcessedLinkFromDB 将查看processed = false 链接并给出其中一个。 限制 1每个线程的起始间隔间隙为 20 秒。
在一个线程内。 1或2秒(抓取的估计处理时间)

line 98  keepS threads from grabbing the same url

如果您看到结果。一根线使之成真。还有其他人访问它。一段时间后哇啊。

所有线程都是独立的。甚至一场比赛数据库在第一个线程处理它时使链接为真

最佳答案

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

一些潜在冲突的事情。

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

我没有阅读日志,因为它们对我来说毫无用处。

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

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

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

关于java - 多个线程使用数据库 DAO 类方法获取的相同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18743828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com