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