有狀態會話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的使用多。