会话 Bean 生命周期详解
1. 钝化与激活机制
在会话 Bean 的管理中,钝化(Passivation)是一个重要的概念。当容器通过某种算法发现某个实例处于空闲状态,等待客户端的下一次调用时,它会将该实例暂时移出内存,并把其状态(如实例变量的值等)保存到二级存储中,这个过程就是钝化。在钝化之前,容器会调用实例的 ejbPassivate()
方法。需要注意的是,处于事务中的会话 Bean 实例不能被钝化。
从被动状态出来有两种途径:一是回到方法就绪状态,二是回到不存在状态。如果客户端调用处于钝化状态的 Bean 实例的方法,容器会通过重新分配存储的值来激活该 Bean,之后调用 ejbActivate()
方法,告知实例重新初始化自身。而如果 Bean 在被动状态下超时,容器会将其放回不存在状态,且不会调用 ejbRemove()
方法,因为激活实例再移除会浪费资源。
2. 无状态会话 Bean 的生命周期
无状态会话 Bean 的生命周期相对简单,仅包含方法就绪状态和不存在状态。由于无状态会话 Bean 在方法调用之间不维护任何客户端特定信息,这使得容器可以创建特定 Bean 类型的多个实例并放入池中,这些实例都能平等地服务任何客户端的调用。
当客户端调用 Bean 的方法时,容器从池中取出任意实例来处理该调用,处理完成后实例回到池中。对于同一客户端的另一次调用,所有实例的资格是平等的,因为它们都没有与客户端保持对话状态。当需要节省内存时,容器可以选择将多个实例送入不存在状态,无需进行钝化操作,因为该 Bean 没有需要存储的客户端状态信息