有狀態sessionbean 無狀態sessionbean

有狀態會話Bean(SFSB)和無狀態會話Bean(SLSB)的區別
1   無狀態   (Stateless)    
    在不同方法調用間不保留任何狀態   。 
    事務處理必須在一個方法中結束   。 
    通常資源佔用較少;可以被共享(因爲它是無狀態的) 。
    無狀態Bean不會"專門"保存客戶端的狀態----(需要強調“專門”是因爲無狀態會話Bean也會有成員變量,有成員變量就可以保存狀態,但它不會專門爲特定的客戶端保存狀態。)。
    ----你對ENTITY   BEAN的數據操作不會被容器維護,當其他的用戶要用ENTITY   BEAN時,裏面的數據不
會被鈍化到服務器的磁盤上。也就是被保存起來。

2   有狀態   (Stateful)    
    可以在不同的方法調用間保持針對各個客戶端的狀態   。 
    與客戶端的聯繫必需被維持;通常開銷較大 。 
    有狀態會話Bean會保存客戶端的狀態 。
    --你對ENTITY   BEAN的數據操作會被容器維護起來,當其他的用戶要用你正在使用的ENTITY   BEAN時,裏面的數據會被鈍化到服務器的磁盤上,例如網上的購物車。

區別的根本原因
這與無狀態會話Bean和有狀態會話Bean的運行原理是相關的。
對於有狀態會話Bean來說,只要有客戶端發送對有狀態會話Bean的訪問,服務器都會創建一個會話Bean實例與該客戶端對應,這樣這個實例與這個客戶端就是一一對應的。如果客戶端在Bean實例中保存了信息,之後還可以使用。
對 於無狀態會話Bean來說,服務器端會維持一個實例池,創建好若干個實例對象供客戶端調用。當從客戶端發送創建會話Bean的請求時,並不一定會真的創建 EJB,多數情況下是從實例池中得到一個實例,用完之後重新放回實例池。如果下次再訪問,再從實例池中取出一個實例使用,並不一定是上次的實例。即使兩次 訪問使用的是同一個實例,在兩次訪問之間也有可能有其他的客戶端訪問了該實例。所以,並不能保證在多次訪問之間的信息會被保存。所以,無狀態會話Bean 不會專門保存客戶端的信息。
各自的優缺點
因 爲有狀態會話Bean需要保存特定客戶端的信息,一個客戶端對應一個實例,既是在當時客戶端有連接沒有訪問的情況下,也要爲這個客戶端保留這個實例。這樣 隨着客戶端數量的增加,服務器端需要創建的實例的數量也在增加,增加到一次程度對服務器的性能就會有一定的影響。爲了不對服務器的性能產生影響,通常服務 器會進行一些優化。當客戶端的數量超過某個值之後,就不創建新的實例。雖然不創建新的實例,還是需要對用戶響應,這時候就採用共享實例的方式。會查看哪個 實例雖然處於連接狀態,但是沒有訪問,然後把這個實例的狀態保存起來,使用這個實例爲新的請求服務,對於原來的客戶端來說,稱爲掛起。如果原來的客戶端又 發送請求了,會重新查找一個空閒的實例並且把已經保存好的狀態恢復回來,這個過程稱爲激活。所以在有狀態會話Bean的訪問過程,經常會發生查找實例,激 活掛起等操作,所以效率比較低。
而發送對無狀態會話Bean的請求的時候,可以隨便取一個空閒的實例爲客戶端服務,所以效率比較高。
有狀態會話Bean的好處是,可以保存客戶端的狀態,所以客戶端在後續訪問的時候就可以少傳遞一些參數。而狀態會話Bean需要傳遞方法執行過程中需要的所有參數。
如何選擇

根據上面分析的有狀態會話Bean和無狀態會話Bean的優缺點。如果要頻繁的訪問,並且多次訪問之間會共享一些信息,這時候應該使用有狀態會話Bean。對於不經常使用的功能,可以使用無狀態會話Bean。無狀態會話Bean的使用要比有狀態會話Bean的使用多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章