2010-11-22 77 views
2

嘿,我有一個關於多線程的問題。首先,DispatcherServlet/DispatcherPorlet有多少個實例?它總是唯一的嗎?即使有人說每秒10個請求?默認情況下單身服務的情況如何?如果我有一個validationService bean被注入處理程序以提供請求驗證,作爲單例(默認情況下),我可以依賴它是單例的事實,並且在某些情況下它不會被重新實例化嗎?高負荷的春季單身豆

回答

0

這是一個有趣的問題。

正如在this previous question中提到的那樣,容器只允許實例化一個servlet實例。在這種情況下,你保證有一個spring上下文和一個singleton。

問題是什麼發生在以前版本的Servlet規範,我不確定明確指定此行爲。

但實際上,容器只能實例化一個servlet實例 - 我從來沒有見過其他的實例。所以假設你只能獲得一個應用上下文是安全的。

+0

謝謝,我知道tomcat實例化單例servlet實例,但我從來沒有使用除Jetty外的其他任何內容,並且我需要該應用程序是可移植的。 – lisak 2010-11-22 12:25:05

0

根據負載情況,servlet容器創建了多個servlet實例,但開發人員無法控制該。但在大多數情況下,容器維護每個servlet的單個實例(因爲無論如何,servlet應該是線程安全的)。

對於Spring singleton bean,這些是每個Web應用程序的單例 - Spring應用程序上下文存儲在servlet上下文中(您可以通過WebApplicationContextUtils.getWebApplicationContext(ServletContext)訪問它)。

至於可靠性:是的,你可以依靠的事實是,在一個Spring應用程序上下文範圍內,每個單獨bean的只有一個實例

+0

但是這裏是衝突,如果servlet容器在高負載下創建了一些實例,它們要麼引用單例DispactherServlet(這不太可能),要麼爲每個Container servlet創建一個DispatcherServlet實例,除非每個DispatcherServlet afaik有一個句柄(無法想象),並且如果每個dispatcherServlet有一個處理程序,則必須有與處理程序一樣多的spring應用程序上下文 – lisak 2010-11-22 11:50:37

+0

看起來您沒有仔細閱讀我的回覆。我沒有說每個SERVLET INSTANCE都有一個Spring ApplicationContext。我說有一個上下文PER WEB APPLICATION,不管有多少個servlet實例,或者你定義了多少個不同的DispatcherServlet(你可以定義多個)。 – 2010-11-22 13:26:14

+0

其實有一個Spring ApplicationContext每個SERVLET實例(當然是在一個Web應用程序中)。 Container將請求委託給單例Servlet。當然,您可以定義多個Dispatcher,但我們正在討論一個調度程序的實例,而不是定義3個調度程序......並且總是隻有一個實例 – lisak 2010-11-22 15:12:12