簡體   English   中英

Tomcat的行為就像沒有在處理線程請求一樣,導致響應時間變慢

[英]Tomcat behaves as if it's not threading requests, causes slow response time

我看到了奇怪的行為,而且我不知道如何獲得進一步的了解,並希望有人可以提供幫助。

背景:我有一個查詢,查詢返回結果要花費很長時間,因此我沒有使用戶根據請求直接等待數據,而是定期通過Timer對象執行此查詢並將結果存儲在靜態變量中。 因此,當用戶請求數據時,我總是總是從靜態變量中拉出數據,因此實際上使響應迅速。 到現在為止還挺好。

問題:不過,我所看到的行為是,如果我在后台(Timer)請求開始查詢數據的同時對數據進行請求,則我的用戶請求將等待數據返回,然后進行響應-迫使用戶等待。 好像tomcat與線程同步運行一樣(我知道不是-只是那樣)。

這是在生產環境中進行的,大部分情況下一切正常,但是對於用戶而言,有時網站只是為他們而掛起,他們覺得它不可靠(從某種意義上來說是這樣)。

我所做的:由於對數據的請求是在靜態方法中,所以我認為“啊!線程被同步化,這導致了延遲!” 因此我退出了所有靜態方法,刪除了同步,並強制每個調用實例化其自己的對象以檢索數據(以確保其線程安全)。 信號量與靜態變量之間也沒有任何同步。

我還安裝了javamelody,以嘗試了解正在發生的事情,但到目前為止沒有新內容。 我注意到很多(大多數)線程處於“等待”狀態,但是它們還有0ms的用戶和CPU時間,所以不要認為這指向任何東西(?)。

運行Tomcat 5.5(無Apache層),struts 2,Java 1.5

如果有人知道為什么對靜態變量的簡單請求會掛起較長的后台進程,我將不勝感激! 或者,如果您知道我如何獲得洞察力,那也將很棒。

謝謝!

一種可能的解釋是,由於長時間運行的查詢引起的數據庫鎖定(或其他原因),線程實際上在數據庫級別處於阻塞狀態。

弄清楚正在發生什么的方法是確切地找出被阻塞的線程在哪里阻塞。 可以通過將SIGQUIT(或等效方法)發送到JVM以及所有Java線程堆棧的堆棧跟蹤來生成線程轉儲。 另外,您可以通過附加調試器等獲得相同的信息(甚至更多)。 無論哪種方式,每個堆棧頂部框架的類名和行號都應允許您查看源代碼並找出(至少)發生了哪種鎖定或阻塞。

對於那些想知道的人,我最終找到了VisualVM( http://visualvm.java.net/download.html )。 這是完美的。 我像往常一樣從eclipse運行Tomcat,它出現在VisualVM客戶端中。 右鍵單擊tomcat圖標,選擇“ Thread Dump”,繁榮,我已經掌握了一切。

謝謝大家的幫助和正確方向的指點!

暫無
暫無

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

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