2012-11-02 52 views
3

衆所周知,Servlets使用單獨的線程爲相應的請求,這提高了服務器的效率。 而在struts2框架中,每個映射的動作類別都有自己的對象,已經爲相應的請求創建。是否比struts2中的動作類更好地使用servlet?

現在,在struts2中,如何將單個對象與普通的servlet中的線程進行比較,這是一種很好的做法(優化)?爲什麼我們不只有servlet!?

回答

5

當一個請求進入一個Web容器時,容器從一個池中取出一個線程來執行請求。一旦處理完請求,線程就會回到池中以供後續請求使用。可以並行處理多個請求,因爲該池有多個可用的線程。

您在Web應用程序中聲明的每個servlet僅由Web容器實例化一次。每個servlet的單個實例因此被多個併發線程使用。這就是爲什麼你的servlet必須是線程安全的。

Struts不會改變上述任何內容。它所做的是定義一個單獨的servlet或過濾器來處理請求的所有全部。對於每個針對給定動作路徑的請求,都會創建一個新的Struts Action實例。這是servlet模型不同的地方。一個servlet是一個單例(所有請求只有一個實例),而爲每個請求實例化一個新的Struts動作。

優點是該動作不需要是線程安全的,因爲它只被一個線程使用,然後被丟棄。它可以包含中間狀態而不需要任何同步。缺點是創建了許多實例。但是由於Java垃圾收集器在回收諸如Struts動作之類的短期對象時非常快速,因此它在實踐中不會造成任何問題。

+0

+1它可以包含中間狀態而不需要同步 – Jaiwo99

相關問題