開發有狀態session bean
盡管有狀態bean和無狀態bean在代碼上的區別不是很大
但兩者才用的對bean的管理的技術是不一樣的
Bean實例的兩種管理技術:
1.無狀態bean使用實例池技術管理bean
bean" name="image_operate_57701323526900703" alt="開發有狀態session
實例池技術會被多個用戶所共享(和數據源技術是相同的)
當用戶從實例池取出一個對象后,這個對象是不能被其他用戶使用的
當用戶使用完這個對象后,這個對象還會被后面的對象所使用
這樣可以大大減少對象的數量,來提高系統性能
2.有狀態bean使用激活(activation)管理bean
bean" name="image_operate_95751323526907265" alt="開發有狀態session
有許多個用戶來訪問,生成多個有狀態bean
將這些有狀態bean緩存起來
當一個用戶訪問過bean后,可能過段時間才繼續訪問,也可能不訪問了
可以去優化這些有狀態bean:
如果這個有狀態bean一段時間內沒有被用戶訪問,則容器把有狀態bean用戶會話信息,序列化到硬盤上,并釋放內存(鈍化)
從內存到硬盤上
如果在總的緩存時間之內,用戶又發起了請求,這時EJB容器會把保存在硬盤上信息的bean又還原到內存中,為用戶服務;(激活)
從硬盤到內存中
如果在緩存時間內用戶沒有訪問(訪問超時),EJB容器有個線程,會把保存在硬盤上的bean信息清除掉;在總的緩存時間過后,再去訪問bean,會得到一個例外(異常),說這個bean已經超時了
采用激活技術,大大提高了系統性能
顯然,無狀態bean的性能是比有狀態bean的性能高
無狀態bean用最少的對象,來為更多的用戶服務
有狀態bean要為每一個用戶創建對象去服務
如果不需要保存用戶狀態時,優先選用無狀態bean
如果要為每個用戶保存他的會話信息時,使用有狀態bean
最經典的有狀態bean的例子:購物車
-----------------------------------------------------------------
有狀態bean的開發步驟和無狀態bean的開發步驟是比較相似的
只需把@Stateless用于標注無狀態bean的注解
更換為:@Stateful
有狀態bean
即可完成有狀態bean的開發,之后通過ant部署到jboss上
代碼:
@Stateful
//有狀態bean
@Remote(HelloWorld.class)//指定HelloWorld接口為遠程接口、默認是本地接口
@Local(HelloWorldLocal.class)
//使用本地接口
public class HelloWorldBean implements HelloWorld,HelloWorldLocal
{
sayHello(String name) {
name+"說:你好,世界!";
}