无状态session bean生命周期
当bean实例不存在时,容器调用bean类的newInstance()方法,开始bean的生命周期接着,容器调用bean的setSessionContext()方法,进而调用ejbCreate()方法。此时,bean就创建完毕,其方法可供调用了当容器不需要该bean实例的时候,容器调用bean的ejbRemove()方法,删除该实例而有状态session bean的生命周期则复杂一些,因为涉及到钝化、激活和事务
有状态session bean生命周期
当客户调用create(args)时,容器调用newInstance()方法,剩下来的创建过程同无状态session bean。有状态session bean的方法执行分为事务与非事务两种情况
a. 不包含事务的方法在该bean处于ready状态后就可以执行
b. 包含事务的方法执行就比较复杂:
客户调用事务方法-->容器调用afterBegin()
客户提交方法-->容器调用beforeCompletion()
事务尝试提交,提交结果可能会成功,也可能会滚事务
事务结束-->容器调用afterCompletion()
钝化与激活
a. 当一个bean很久没有被操作时,容器会决定该bean是否应该被钝化(从内存中擦除, 将状态信息记入存储介质。)
ps:有人说记录方法一定是java的序列化,其实不然。容器可以采取任何方法对状态信息进行记录。
b. 钝化后,又经过一段时间该bean仍然没有被操作,容器将会把它从存储介质中删除。以后,任何针对该bean方法的调用容器都会抛出java.rmi.NoSuchObjException
c. 若钝化后有针对此bean方法的调用,容器会激活该bean,将其重新加载入内存
当容器不需要该bean实例的时候,容器调用ejbRemove()方法,删除该实例ejb容器只有在ejb实例不存在的情况下才会创建实例,否则,容器会在实例池中查找可用实例并复用。由于ejb不适那种轻量的,可以大量创建并删除的对象,所以,每次新实例的创建都会占用很大的资源。实例池的概念,以及钝化、激活,都是针对ejb这种特点而设计的。所以,当你的应用不需要分布式,安全,持久化以及事务处理时,你要考虑是否采取ejb这种重量级的数据层抽象。取而代之,诸如hibernate等轻量级的数据持久层,或者是直接使用JDBC来操作javabean这样谈不上量级的DAO都是可以选择的。