2008-09-20 40 views
1

當他們說struts框架中的動作控制器是多線程時,是否意味着有多個servlet實例接受請求並將其轉發給模型。或者是否意味着有一個實例接受所有請求?任何視覺效果將不勝感激struts動作控制器 - 多線程?

回答

1

正如大多數其他servlets一樣,創建一個單獨的線程來處理每個請求。您必須實現接口SingleThreadedModel以獲取每個請求的servlet新實例。

1

看到http://struts.apache.org/1.x/userGuide/building_controller.html

Struts控制器servlet創建只有一個Action類的實例,並使用這一個實例來服務所有請求。因此,您需要編寫線程安全的Action類。遵循您將用於編寫線程安全的Servlet的相同準則。這裏有兩個一般準則,這將幫助你編寫出可伸縮的,線程安全的Action類:

  • 只有使用局部變量 - 最重要的原則,即線程安全編碼艾滋病是隻使用局部變量, ,而不是你的Action類中的實例變量。局部變量創建在由每個請求線程分配的棧上(由您的JVM),因此不必擔心共享它們。只要所有需要的變量都作爲方法參數傳遞,一個Action可以被分解到幾個本地方法中。這確保了線程的安全性,因爲JVM在內部使用與單個線程關聯的調用棧來處理這些變量。

  • 節約資源 - 作爲一般規則,分配稀缺資源,並讓他們跨請求來自同一用戶(在用戶的會話)可能會導致可伸縮性問題。例如,如果您的應用程序使用JDBC併爲每個用戶分配一個單獨的JDBC連接,那麼當您的站點突然顯示在Slashdot上時,您可能會遇到一些可伸縮性問題。在將控制轉發到適當的View組件之前,您應該努力使用池並釋放資源(如數據庫連接) - 即使您調用的bean方法拋出異常。

1

struts 1不是線程安全的;但至於strus 2,每個請求只有一個實例。