ejb 關於有狀態會話bean和無狀態會話bean的區別

session  Bean:分有狀態會話Bean和無狀態會話Bean兩種,主要目的是提供程序邏輯層;
Entity  Bean:資料組件,主要目的是提供程序資料;

 

下面主要對Session  Bean討論

 

現實中,很多朋友對兩種session bean存在誤解,認爲有狀態是實例一直存在,保存每次調用後的狀態,並對下一次調用起作用,而認爲無狀態是每次調用實例化一次,不保留用戶信息。仔細分析並用實踐檢驗後,你會發現,事實恰好相反:
有狀態和無狀態會話bean的本質區別是它們的生命期。
首先解釋一個下面要用到的概念--用戶:session bean 的用戶實際上就是直接調用ejb的類的實例,甚至是這個實例的某個方法。同一個類的不同實例對於session bean 來說是不同的用戶。
有狀態會話bean :每個用戶有自己特有的一個實例,在用戶的生存期內,bean保持了用戶的信息,即“有狀態”;一旦用戶滅亡(調用結束或實例結束),bean的生命期也告結束。即每個用戶最初都會得到一個初始的bean。
無狀態會話bean :bean一旦實例化就被加進會話池中,各個用戶都可以共用。即使用戶已經消亡,bean 的生命期也不一定結束,它可能依然存在於會話池中,供其他用戶調用。由於沒有特定的用戶,那麼也就不能保持某一用戶的狀態,所以叫無狀態bean。但無狀態會話bean 並非沒有狀態,如果它有自己的屬性(變量),那麼這些變量就會受到所有調用它的用戶的影響,這是在實際應用中必須注意的。

區別的根本原因
這與無狀態會話Bean和有狀態會話Bean的運行原理是相關的。
對於有狀態會話Bean來說,只要有客戶端發送對有狀態會話Bean的訪問,服務器都會創建一個會話Bean實例與該客戶端對應,這樣這個實例與這個客戶端就是一一對應的。如果客戶端在Bean實例中保存了信息,之後還可以使用。
對 於無狀態會話Bean來說,服務器端會維持一個實例池,創建好若干個實例對象供客戶端調用。當從客戶端發送創建會話Bean的請求時,並不一定會真的創建 EJB,多數情況下是從實例池中得到一個實例,用完之後重新放回實例池。如果下次再訪問,再從實例池中取出一個實例使用,並不一定是上次的實例。即使兩次 訪問使用的是同一個實例,在兩次訪問之間也有可能有其他的客戶端訪問了該實例。所以,並不能保證在多次訪問之間的信息會被保存。所以,無狀態會話Bean 不會專門保存客戶端的信息。

各自的優缺點
因 爲有狀態會話Bean需要保存特定客戶端的信息,一個客戶端對應一個實例,既是在當時客戶端有連接沒有訪問的情況下,也要爲這個客戶端保留這個實例。這樣隨着客戶端數量的增加,服務器端需要創建的實例的數量也在增加,增加到一定程度對服務器的性能就會有一定的影響。爲了不對服務器的性能產生影響,通常服務 器會進行一些優化。當客戶端的數量超過某個值之後,就不創建新的實例。雖然不創建新的實例,還是需要對用戶響應,這時候就採用共享實例的方式。會查看哪個 實例雖然處於連接狀態,但是沒有訪問,然後把這個實例的狀態保存起來,使用這個實例爲新的請求服務,對於原來的客戶端來說,稱爲掛起。如果原來的客戶端又 發送請求了,會重新查找一個空閒的實例並且把已經保存好的狀態恢復回來,這個過程稱爲激活。所以在有狀態會話Bean的訪問過程,經常會發生查找實例,激 活掛起等操作,所以效率比較低。
而發送對無狀態會話Bean的請求的時候,可以隨便取一個空閒的實例爲客戶端服務,所以效率比較高。
有狀態會話Bean的好處是,可以保存客戶端的狀態,所以客戶端在後續訪問的時候就可以少傳遞一些參數。而無狀態會話Bean需要傳遞方法執行過程中需要的所有參數。

如何選擇
根據上面分析的有狀態會話Bean和無狀態會話Bean的優缺點。如果要頻繁的訪問,並且多次訪問之間會共享一些信息,這時候應該使用有狀態會話Bean。對於不經常使用的功能,可以使用無狀態會話Bean。無狀態會話Bean的使用要比有狀態會話Bean的使用多。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章