2016-02-14 63 views
4

考慮一個無狀態EJBejb線程安全:我們需要它嗎?

從EJB 3.1規範
容器將支持會話
豆併發執行的多個實例;但是,每個實例只能看到方法調用的序列化序列。因此,有狀態或
無狀態會話bean不必被編碼爲折返

所以無狀態seession豆能「服務」最多一個請求的時間, 這通常是由容器管理實施一大堆豆子。 所有這些的偉大目標是線程安全。

我的問題是爲什麼我們需要這種形式的線程安全? 我的意思是Spring bean是單例的,而不是線程安全的(它們可以一次處理任意數量的請求),我們沒有任何問題。

回答

4

如果無狀態會話bean具有本身不是線程安全的成員變量(例如,SAXParser),那麼您需要這種形式的線程安全性。但是,由於無狀態會話bean沒有像有狀態會話bean那樣的客戶端關聯,所以用例肯定是比較少見的,並且servlet編程模型似乎表明這種保護級別可能不是必需的,所以如果不需要線程安全,然後從EJB 3.1開始,可以使用具有Bean管理併發性的單例會話Bean。

線程安全限制還爲EJB容器提供了一些額外的自由來優化。例如,如果EJB容器知道一次只有一個線程可以使用無狀態會話bean,那麼它可以在方法入口/出口處操縱注入對象的狀態,以便這些對象不需要使用ThreadLocal(例如, UserTransaction或SessionContext)。

+0

感謝您的回答,我會保持問題在其他人想要添加他們的意見的情況下打開:) – GionJh

+0

我認爲@Brett凱爾意思是「成員變量本身不是線程安全的」) – GionJh

+1

@GionJh確實,修正了,謝謝:-)。 –