会话组件(Session Beans)
帮助类
CartEJB 组件有两个帮助类: BookException和 IdVerifier,其中 BookException 是应用定义的异常而IdVerifier 用于在djbCreate方法中验证customerId 的有效性。帮助类在J2EE应用打包时包含在EJB.jar文件中,与企业组件类在同一包。
状态管理模式
在为会话组件指定不属描述符时,不想选择会话组件的状态模式:有状态和无状态。
有状态会话组件(Stateful Session Beans)
CartEJB 这个例子有三个实例变量:customerName, customerId, 和 contents,这些变量代表了购物车应用的会话状态。因为CartEJB 具有会话状态,所以把它叫做有状态会话组件。
状态在客户端与会话组件会话期间保留,当客户端移交(remove)组件、会话结束后状态消失。解决这种状态的短暂性不是什么问题,然而,因为客户端和组件之间会话结束后不再需要保留状态。
无状态会话组件(Stateless Session Beans)
无状态会话组件在会话期间不需要为特定的客户端保存状态,因而得名。当客户端调用无状态组件时,组件实例变量可能会有状态,但仅仅只是在调用过程中。当方法执行结束后,状态不再保留。除了方法调用期外,所有的无状态组件实例都是相等地,允许EJB容器将任何一个实例分配给任意一个苦户端。
因为无状态组件可以支持多个客户端,从拥有大量客户端的应用来客比有状态会话组件具有更大的灵活性。通常情况下,应用要求用更多的无状态组件而非有状态组件来相应相同的客户端。
有时,EJB容器会将状态组件写到缓存中,但无状态组件是从来不会这么做的。因此,相对而言无状态组件能够提供比有状态组件更高的性能。无状态组件的本地接口必须有一个无参数的create 方法,同时会话组件也必须有个与其相对应的无参数ejbCreate 方法。
两种会话组件的选择
下列情况下,建议选择有状态组件:
·在组件创建时必须初始化其状态
·组件必须保留客户端方法商业方法的信息
·客户端是交互式应用
既然会话组件的主要目的是在J2EE服务器上表现客户端功能,更多的会话组件会是有状态会话组件。不过,在下述情况下建议使用无状态会话组件:
·组件执行的任务不讲究是否对应特定客户端,如数据库查询
·组件无需保留客户端对方法调用的信息
会话组件的生命周期
会话组件在其生命周期中有多个状态,其生命周期由EJB容器所管理而非应用本身。尽管应用无法管理组件的生命周期,但下面关于生命周期的信息对于管理如数据库连接的资源是有用的。
有状态会话组件的生命周期
有状态会话组件的生命周期源于客户端通过create 方法、EJB容器实例化组件后调用会话组件的setSessionContext 和ejbCreate 方法。此后,组件的商业方法处于可调用的就绪阶段。
在就绪阶段,EJB容器将判断组件是否可以处于非活动、钝化状态,然后将其从内存转移到缓存(典型的算法是采用最近最少调用算法),EJB容器调用组件的ejbPassivate 方法实现对组件的钝化。如果在钝化阶段有客户端调用该组件的商业方法,EJB容器将激活组件并将其恢复到就绪状态,然后调用组件的ejbActivate 方法。
在生命周期最后,客户端调用remove 方法、EJB容器调用组件的ejbRemove 方法,组件实例等待垃圾回收器回收处理。
在客户端编程中,主要通过调用两个生命周期相关方法-- create 和 remove 方法实现对生命周期的处理。下图中所有的方法调用都是由服务器端EJB容器实现的,如 ejbCreate 方法,允许你在组件实例化后进行数据库连接等操作。
无状态会话组件生命周期
因为无状态会话组件从来不被钝化,所有它的声明周期只有两个阶段:在商业方法调用过程中的不存阶段在和就绪阶段。
0
相关文章