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 方法。