單個servlet如何以用戶請求的形式處理多個客戶端請求?基於單例設計模式,我知道我們創建了一個servlet實例,但單個servlet如何處理數百萬個請求。對於涉及它的線程也感到困惑。單個servlet如何處理來自客戶端的多個請求
此外,還可以在這裏發送任何瀏覽器規範或設置,以便發送請求或生成爲請求發送的線程。
所有的框架都是一樣的,還是不同的說例如struts v/s spring?
單個servlet如何以用戶請求的形式處理多個客戶端請求?基於單例設計模式,我知道我們創建了一個servlet實例,但單個servlet如何處理數百萬個請求。對於涉及它的線程也感到困惑。單個servlet如何處理來自客戶端的多個請求
此外,還可以在這裏發送任何瀏覽器規範或設置,以便發送請求或生成爲請求發送的線程。
所有的框架都是一樣的,還是不同的說例如struts v/s spring?
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));
每個請求都在一個單獨的線程中處理。這並不意味着tomcat爲每個請求創建一個線程。有一個線程池來處理請求。每個servlet還有一個實例,這是默認情況。(Some more information)。 您的servlet應該是Thread Safe
。
如果你的servlet實現SingleThreadModel
接口的servlet的每個線程使用單獨的實例。 SingleThreadModel
is deprecated,請勿使用它。
我做了這個答案,因爲社會的維基。
您不會創建多個servlet實例。 servlet引擎爲每個請求創建一個單獨的線程(最大線程數最大值) 性能與線程數相關,而不是servlet實例數。
例如,如果有1000個請求,並且servlet可以生成的最大線程數爲100,那麼會出現性能下降。
爲了避免這個問題,我們可以使用負載平衡器,將多個服務器放在負載平衡器後面。 負載平衡器應配置爲根據不同的參數/設置(循環分配,負載分配等)將請求「路由」到任何一臺服務器。您需要的負載越多,您應該添加的服務器就越多。但是,這確實會通過負載均衡器發送所有流量,所以重要的是這是冗餘且故障轉移安全的。
這些servlet被集中在一起,一次不只有一個實例。 – meskobalazs 2015-01-04 12:35:24
您可能想看看[連接器池](http://docs.oracle.com/cd/E23507_01/Platform.20073/ATGInstallGuide/html/s0902tomcatconnectorthreadconfigurati01。HTML)爲例。他們通過線程幫助處理多個請求。 – 2015-01-04 12:37:34
@AlexanderTorstling你完全錯了。一個servlet是一個單例,並在所有請求之間共享。每個請求都由一個線程提供服務,併發請求由併發線程提供,每個線程同時調用同一個servlet。 – 2015-01-04 12:46:12