会话(session)bean的介绍
会话bean能够完成客户所需要的业务操作。作为业务对象,会话bean能够实现业务逻辑,业务规则,算法,工作流等。比如会话bean能够完成查价,订单登记,食品压缩,银行事务,股票交易,数据库操作,复杂计算等。而且会话bean是可重用的组件,供操作业务流程中的逻辑使用。
会话bean的生命周期
会话bean不是持久化的,它仅仅是内存对象,会话bean不会保存到持久化存储源中,一旦其生存的周边环境遭到破坏,会话bean也将不复存在。通常客户会话的(Client Session)的持续其决定了使用的会话bean的存活期,如果客户超时EJB容器将销毁会话bean实例,会话bean实例是存活短暂的对象,并且会话bean实例不能够在多客户间共享。
会话bean的子类型
会话bean有两种子类型:有状态会话bean和无状态会话bean(区别上一篇中将过了)
有状态会话bean
实现实例池功能:EJB容器为了限制内存中运行的有状态会话bean实例的数量,EJB容器需要将有状态会话bean的会话状态保存到硬盘或者其它存储源中,该过程称之为挂起(Passivation)。在挂起有状态会话bean后,会话状态会被安全的保存下来,而且其释放的内存可以供其他应用(或EJB实例)使用。一旦被挂起的有状态会话bean实例的客户再次调用它,被挂起的会话状态将重新回到有状态的会话bean实例中,该过程称之为激活(Activation)。现在有状态会话bean实例恢复了同原先客户的会话。但是激活的有状态会话bean实例不一定是服务于原先客户的那个实例,但并不影响使用。
EJB实例也具有有状态会话bean的实例池功能,在处理多个并发客户时,只需要在内存中存活若干个有状态会话bean实例。代价是挂起和激活过程将导致I/O性能瓶颈。维护无状态会话bean实例池是十分简单的,因为没有会话状态需要维护。无状态会话bean不存在挂起和激活操作,EJB容器可以随心所欲的销毁它。
EJB容器会挂起和激活哪个有状态会话bean实例? 这取决于EJB容器。
大部分容器使用最近最少使用(Least Recently Used LRU)策略,及简单的挂起最近没有使用到的有状态会话bean实例。如果有状态会话bean实例最近没有使用到,则EJB容器会挂起它,从而将会话状态保存到硬盘上。只要有状态会话bean实例没有参与到客户请求中,容器就能够随时挂起它。
为激活有状态会话bean实例,大部分EJB容器都会使用just-in-time算法,即只有在客户请求到来时,才会激活有状态会话bean实例。如果客户请求传到EJB容器中,而且容器已经挂起了该客户的会话状态,则容器马上激活它,从而将挂起状态信息写到内存中。