2012-09-07 43 views
3

我正在編寫一個應用程序,在UDP上偵聽傳入消息。我的主線程收到來自網絡的消息之後的消息,並將它們中的每一個傳遞給使用執行程序進行處理的新線程。多線程性能

每個處理線程都對其負責的消息進行必要的處理,並將其添加到在所有處理線程之間共享的LinkedBlockingQueue

然後,我有一個數據庫工作線程,通過10000條消息塊排出隊列,並將消息塊插入到數據庫中。由於郵件到達率可能很高(每秒超過20000條郵件),因此我認爲使用LOAD DATA INFILE更有效。因此,此DB工作線程如前所述耗盡隊列,創建一個包含使用CSV格式的所有消息的臨時文件,並使用另一個執行程序將創建的文件傳遞給另一個線程。這個新線程使用JDBC執行LOAD DATA INFILE聲明。

經過測試我的應用程序後,我認爲性能並不好,我正在尋找提高多線程級別和數據庫訪問級別性能的方法。

我確切的說我使用MySQL作爲DBMS。

謝謝

回答

3

您需要確定爲什麼你的表現很差。

E.g.如果您將數據順序寫入數據庫更有可能成爲您的瓶頸,那麼很可能您不需要多個線程。在不需要的時候使用多線程的問題是它增加了複雜性,這本身就是開銷,並且比使用單線程要慢。

我會嘗試看看性能如何,如果你做的一切只是將數據加載到數據庫中。即寫入文件並丟棄它。

+0

我只能使用沒有子線程的DB工作線程。在這種情況下,這些文件將通過此DB工作線程一個接一個地寫入數據庫。但我認爲在寫入文件(同步JDBC調用)期間,我可以使用這段時間向數據庫發出另一個文件。你認爲這是不必要的嗎? –

+0

如果不測量每個階段的差異,就不可能知道。即使擁有十二年優化Java程序的經驗,通過衡量系統性能而不是猜測,我感到驚訝。 –

+0

您是否有一些資源讓我瞭解如何衡量多線程應用程序的性能? –

0

如果沒有任何分析器輸出,很難分辨出來,但我的(未受教育的)猜測是,瓶頸是您將更改寫入硬盤驅動器上的文件,然後提示您的數據庫讀取並解析此文件。存儲訪問總是比存儲器訪問慢得多。所以這可能比從內存向數據庫提供查詢慢得多。

但這只是猜測。也許瓶頸是你或我從未想到過的地方。當你真的想知道你的應用程序的哪一部分吃了多少CPU時間時,你應該使用Profiler4j這樣的分析器來分析你的程序。

+0

關於訪問硬盤驅動器,我不認爲我有選擇。最後,我希望我的消息在數據庫中,並且由於使用LOAD DATA INFILE更加高效,我必須將消息寫入文件中,除非存在另一種可能性? –