Entity bean
為了復(fù)用Bean,會(huì)采用一級(jí)Cache加上一級(jí)InstancePool(StatelessSessionBean是不需要Cache的),
從而支持將StatefulSessionBean持久化到磁盤(pán),支持EntityBean的Bean Instance
(注意這個(gè)Bean Instance和client得到的EntityBean是不同的,它沒(méi)有和任何的DB Record關(guān)聯(lián))的復(fù)用,
這就導(dǎo)致了ejbactivate、ejbPassivate等的引入。
ejbPassivate:當(dāng)一個(gè)bean實(shí)例被客戶引用,并執(zhí)行一個(gè)業(yè)務(wù)方法后,容器會(huì)自動(dòng)讀取bean的實(shí)例字段,
然后通過(guò)容器與數(shù)據(jù)庫(kù)發(fā)生關(guān)系,保存改變的數(shù)據(jù),執(zhí)行完畢后bean被鈍化,并調(diào)用ejbpassviate()方法通知bean。
ejbactivate:當(dāng)客戶過(guò)一端時(shí)間又調(diào)用這個(gè)bean的某業(yè)務(wù)方法時(shí),被鈍化的bean又重新的激活,但是并不是馬上執(zhí)行這個(gè)業(yè)務(wù)方法,
而是由ejb對(duì)象首先調(diào)用ejbactivate()方法通知bean,bean實(shí)例要激活,然后從數(shù)據(jù)庫(kù)中提取數(shù)據(jù),并自動(dòng)將數(shù)據(jù)值映射到bean實(shí)例,
然后調(diào)用ejbload()方法,實(shí)例被再一次初始化,最后才開(kāi)始執(zhí)行要執(zhí)行的業(yè)務(wù)方法。
Stateful Session Bean
以 Stateful Session Bean 為例:其 Cache 大小決定了內(nèi)存中可以同時(shí)存在的 Bean 實(shí)例的數(shù)量,根據(jù) MRU 或 NRU 算法,實(shí)例在激活和去激活狀態(tài)之間遷移,激活機(jī)制是當(dāng)客戶端調(diào)用某個(gè) EJB 實(shí)例業(yè)務(wù)方法時(shí),如果對(duì)應(yīng) EJB Object 發(fā)現(xiàn)自己沒(méi)有綁定對(duì)應(yīng)的 Bean 實(shí)例則從其去激活 Bean 存儲(chǔ)中(通過(guò)序列化機(jī)制存儲(chǔ)實(shí)例)回復(fù)(激活)此實(shí)例。狀態(tài)變遷前會(huì)調(diào)用對(duì)應(yīng)的 ejbActive 和 ejbPassivate 方法。