根據我的理解,無狀態會話bean用於編寫業務邏輯。他們不能將數據存儲在他們的實例變量中,因爲他們的實例被多個請求共享。所以他們似乎更像Singleton類。然而,不同之處在於爲每個請求創建(或從池中重用)無狀態會話bean的單獨實例。爲什麼無狀態會話bean是單線程的?
在使用Google搜索之後,我可以找到Java EE規範說他們假設爲單線程的原因。但我不明白爲什麼指定爲SINGLE THREADED?
根據我的理解,無狀態會話bean用於編寫業務邏輯。他們不能將數據存儲在他們的實例變量中,因爲他們的實例被多個請求共享。所以他們似乎更像Singleton類。然而,不同之處在於爲每個請求創建(或從池中重用)無狀態會話bean的單獨實例。爲什麼無狀態會話bean是單線程的?
在使用Google搜索之後,我可以找到Java EE規範說他們假設爲單線程的原因。但我不明白爲什麼指定爲SINGLE THREADED?
由於TX上下文,SLSB是單線程的,當調用它時,Principal與一個bean實例關聯。這些bean被合併,除非達到最大池大小,在單獨的線程中處理(由供應商決定)。
如果SLSB被設計成線程安全的,每個調用看起來都像servlet doGet/Post,請求信息包含Tx上下文,安全上下文信息等。因此,至少代碼看起來乾淨(取決於開發人員)。
無狀態會話bean是單線程的主要原因是爲了使它們對容器高度可擴展。容器可以對運行時環境做出很多簡化的假設。第二個原因是讓開發人員的生活更輕鬆,因爲開發人員不必擔心業務邏輯中的任何同步或再次入侵,因爲這個bean永遠不會在另一個線程上下文中調用。
我記得在對原始EJB 1.0規範的評論中討論的推理。我會看看規範的目標部分。有關規格列表,請參閱http://java.sun.com/products/ejb/docs.html。