2015-01-04 67 views
16

單個servlet如何以用戶請求的形式處理多個客戶端請求?基於單例設計模式,我知道我們創建了一個servlet實例,但單個servlet如何處理數百萬個請求。對於涉及它的線程也感到困惑。單個servlet如何處理來自客戶端的多個請求

此外,還可以在這裏發送任何瀏覽器規範或設置,以便發送請求或生成爲請求發送的線程。

所有的框架都是一樣的,還是不同的說例如struts v/s spring?

+1

這些servlet被集中在一起,一次不只有一個實例。 – meskobalazs 2015-01-04 12:35:24

+0

您可能想看看[連接器池](http://docs.oracle.com/cd/E23507_01/Platform.20073/ATGInstallGuide/html/s0902tomcatconnectorthreadconfigurati01。HTML)爲例。他們通過線程幫助處理多個請求。 – 2015-01-04 12:37:34

+2

@AlexanderTorstling你完全錯了。一個servlet是一個單例,並在所有請求之間共享。每個請求都由一個線程提供服務,併發請求由併發線程提供,每個線程同時調用同一個servlet。 – 2015-01-04 12:46:12

回答

11

Struts/Spring框架實際上是在Servlet規範的基礎上編寫的,因此無論您在Servlet規範下使用什麼都可以。

您是對的,只創建Servlet的單個實例,但該實例在多個線程之間共享。出於這個原因,你不應該在你的Servlets中共享可變狀態。

例如你有以下的servlet映射到http://localhost/myservlet

class MySerlvet extends HttpServlet { 

    public void doGet(HttpServletRequest req, HttpServletResponse res) { 
      // Get Logic 
    }  
} 

Web服務器將在它的代碼相似(不一定是相同的)東西。

MyServlet m = new MyServlet(); // This will be created once 

// for each request for http://localhost/myservlet 
executorService.submit(new RequestProcessingThread(m)); 
20

每個請求都在一個單獨的線程中處理。這並不意味着tomcat爲每個請求創建一個線程。有一個線程池來處理請求。每個servlet還有一個實例,這是默認情況。(Some more information)。 您的servlet應該是Thread Safe

enter image description here

如果你的servlet實現SingleThreadModel接口的servlet的每個線程使用單獨的實例。 SingleThreadModel is deprecated,請勿使用它。

SingleThreadModel

我做了這個答案,因爲社會的維基。

+0

所以在這種情況下,這種情況背後的機制是什麼?如果我們不使用SingleThreadModel,那麼這個servlet就不是線程安全的,我們該如何克服這個問題? – xtiger 2015-04-13 05:36:24

+1

@xtiger:有很多方法可以讓你的servlet成爲線程安全的。例如,如果你不使用在類作用域中定義的變量,它將是線程安全的。 – 2015-04-14 12:35:57

+0

@Ali Sepehri.Kh你是什麼意思,「我把這個答案作爲社區維基。」 ? – Dedyshka 2015-06-23 12:08:04

2

您不會創建多個servlet實例。 servlet引擎爲每個請求創建一個單獨的線程(最大線程數最大值) 性能與線程數相關,而不是servlet實例數。

例如,如果有1000個請求,並且servlet可以生成的最大線程數爲100,那麼會出現性能下降。

爲了避免這個問題,我們可以使用負載平衡器,將多個服務器放在負載平衡器後面。 負載平衡器應配置爲根據不同的參數/設置(循環分配,負載分配等)將請求「路由」到任何一臺服務器。您需要的負載越多,您應該添加的服務器就越多。但是,這確實會通過負載均衡器發送所有流量,所以重要的是這是冗餘且故障轉移安全的。

相關問題