簡體   English   中英

使用數據庫DAO類方法獲取的相同值的多個線程

[英]multiple threads using same value fetched by database DAO class method

Status: solved

我必須制作一個pastebin,因為我必須指出行號。

注意:不使用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/2c4pU1K8,http://pastebin.com/2S3301gD

我在for循環中啟動了許多線程(10),並實例化了一個runnable類,但似乎我從db獲得相同的結果(我從db獲取一些字符串,然后更改它)但是對於each thread, I get same string (盡管每個線程都改變了它。) 使用jdbc for postgresql可能是什么常見的問題?

line 252

and line 223

該鏈接標記為已processed. (true) processed. (true)在db中。 crawler class其他線程也可以。 所以當line 252應該得到一個鏈接。 它應該被processed = false 但我看到所有threads take same link.

當其中一個線程抓取鏈接時。 它使得它被處理=真。 其他人則不應抓它。 (得到它)是標記的processed = 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

如果你看到結果。 一個線程使它成為現實。 還有其他人訪問它。 waaaay過了一段時間。

所有線程都是分開的。 甚至一場races db在第一個線程處理它時使鏈接成立

這是一個沒有提出簡明問題的情況。 那里有很多代碼, 不知道發生了什么。 你需要將它分解,以便你能夠理解它出錯的地方,然后告訴我們這一點。

有些潛在沖突的事情。

  • 您正在為幾乎每個進程打開數據庫連接。 應用程序的正常流程是打開一些連接,進行一些處理,然后關閉它們。
  • 你在處理數據庫提交嗎? 我不記得postres數據庫的默認設置是什么,你必須仔細研究它。
  • 單個網址有3種狀態。未處理,正在處理,處理。 我認為你根本不處理'正在處理'狀態。 由於處理過程需要時間並且可能會失敗,因此您必須考慮這些情況。

我沒有閱讀日志,因為它們對我沒用。

-edit for comment-數據庫通常有交易。 在提交之前,您在一個事務中進行的修改在其他事務中不會出現。 交易可以回滾。 您需要查看獲取剛更新的行並查看值是否真的發生了變化。 在另一個事務或另一個連接中執行此操作。

20秒的間隙看起來只有在過程開始時才會出現。 想象一個線程1處理URL1線程處理URL2的情況。 他們都在大約同一時間完成。 它們都尋找下一個未處理的URL(比如URL3 )。 他們都會開始處理這個Url,因為他們不知道另一個線程已啟動它。 您需要一個流程來分發Url,可能是您想要查看的隊列。

如果您知道哪些線程正在處理哪些URL,則可能會改進日志記錄。 您還需要一個較小的樣本量,以便您可以了解正在發生的事情。

盡管在這篇文章中幫助者的評論和回應也是正確的。

在crawl()方法體的開頭。

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

並且在crawl()方法體的底部(當它完成處理時):

    crawl(nonProcessedLinkFromDB);

實際上解決了這個問題

標記鏈接處理為true和獲取新鏈接並讓其他線程在當前正在處理它時獲得相同鏈接之間差距。

Synchonized block有助於進一步發展。

感謝幫助。 IRC頻道上的“Fuber”。 Quakenet服務器#java和Freenode服務器## javaee

和所有支持我的人!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM