2010-10-01 33 views

回答

4

誘人的機制是使用ThreadLocal的存儲,但在一些應用服務器這是很危險的 - 應用服務器可能使用線程池,並且單個請求可能由不同線程的不同線程處理。

某些應用程序服務器(我知道WebSphere確實)爲此提供了特定的API。在WAS中它是一個UserWorkArea。請參閱here以獲取參考資料,稍後介紹該文章。

我不知道這個問題的便攜式解決方案。

+0

是的,我們在WAS中這樣做。出於同樣的原因,我沒有提出這個建議。所以,我會說+1。 – 2010-10-01 08:16:56

+0

發現這個,http://www.devwebsphere.com/devwebsphere/2005/06/dont_use_thread.html。雖然年代久遠,但我認爲它值得閱讀。 – 2010-10-01 08:22:20

+0

謝謝,即時通訊使用Tomcat6,並不確定它是否是1線程/請求...將進入線程本地 - 謝謝! – Ricardo 2010-10-01 09:17:30

1

一種解決方案可能是使用ThreadLocal。在請求結束時請小心清理它。

+0

我如何知道請求的結束時間?你知道我是否可以在struts攔截器內安全地使用threadlocal? – Ricardo 2010-10-01 09:40:56

2

不要將HttpSession傳遞給你「標準」的Java類。爲了獲得更好的解決方案,請檢查Spring或Guice等依賴注入容器,並閱讀會話範圍。

這通常是通過線程本地模式和servlet過濾器的組合來解決的,但通常使用「標準」Java類直接訪問會話,請求等是很糟糕的。

+0

我完全同意。 +1 – 2010-10-01 08:18:13

0

你想要的是一個全局變量,並且「污染」其他類中的參數列表會更清晰。它變得更容易閱讀和測試。

如果您想避免依賴於servlet.jar的代碼,請使用適配器模式:爲您所需的操作創建一個接口,讓您的方法接受該接口的參數,然後製作一個簡單的包裝器實現只是委託給HttpSession。