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