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