EJB系列(三)--有状态会话Bean和无状态会话Bean

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010121883/article/details/52043765

EJB的基本分类

    EJB分为EnterpriseBean(企业Bean)和Persistence(持久化),持久化Bean指的是Entity Bean(实体Bean,是一个代表存在于数据库中业务对象的复杂业务实体)。企业Bean又包括Session Bean(会话Bean,完成一个清晰的解耦的任务)和Message Driven Bean(MDB,消息驱动Bean,基于JMS,专门用于异步处理Java 消息的组件。具有处理大量并发消息的能力)。会话Bean又包括Stateless Session Bean(无状态会话Bean)和Stateful Session Bean(有状态会话Bean)。

会话Bean

    本篇主要介绍会话Bean。

    会话(Session):从客户端获得EJB对象开始,然后调用EJB的方法(可以多次),直到客户端生命周期结束,或客户端释放了EJB对象为止,称为一次会话。随着会话的终止,EJB对象也有可能会被EJB容器销毁。

    会话Bean:负责与客户端交互,是编写业务逻辑的地方,在会话 bean 中可以通过 JDBC 直接操作数据库,但大多数情况下都是通过实体 bean 来完成对数据库的操作。

有状态会话Bean

    有状态会话Bean,即EJB能够为同一个客户端在多次请求(方法调用)之间保持状态信息。

    举例:基于某种原因(可能是因为系统要支持多种不同类型的客户端),购物篮功能作为系统的核心业务,需要由EJB对象来担当(而不是由HTTP SESSION对象)。那么EJB必须能够区分不同的客户端,并分别为不同的客户端保持与其对应的状态信息。即,从某个客户端的角度来看,似乎EJB对象正被它独占了一样,不会因为有任何其它的客户端同时对同一个EJB访问而影响其最终的计算结果。

    原理:对于有状态会话Bean来说,只要有客户端发送对有状态会话Bean的访问,服务器都会创建一个会话Bean实例与该客户端对应,这样这个实例与这个客户端就是一一对应的。如果客户端在Bean实例中保存了信息,之后还可以使用。

    自己的话:第一次会话和第二次会话之间不受影响,对象在每次会话中,相当于新new一个。

    有状态会话Bean,用@Stateful注解。

无状态会话Bean

    无状态会话Bean,并非是说EJB不能存在状态,而是说EJB容器不会对EJB的状态做管理。容器会使用实例池的方式,甚至单例的方式来实现无状态的SessionBean。

    举例:税费计算或者转移账款。当计算税费额的方法被调用时,税费值被计算并返回给调用的方法,没有必要存储调用者为将来调用备用的内部状态。因为它们不维护状态,所以这些Bean是仅仅由容器管理。当客户端请求一个无状态的Bean实例时,它可以接收来自由容器管理的无状态会话Bean实例集中的一个实例。也 因为无状态会话Bean能够被共享,所以容器可以维护更少数量的实例来为大量的客户端服务。

扫描二维码关注公众号,回复: 3862293 查看本文章

    原理:对 于无状态会话Bean来说,服务器端会维持一个实例池,创建好若干个实例对象供客户端调用。当从客户端发送创建会话Bean的请求时,并不一定会真的创建 EJB,多数情况下是从实例池中得到一个实例,用完之后重新放回实例池。如果下次再访问,再从实例池中取出一个实例使用,并不一定是上次的实例。即使两次访问使用的是同一个实例,在两次访问之间也有可能有其他的客户端访问了该实例。所以,并不能保证在多次访问之间的信息会被保存。所以,无状态会话Bean 不会专门保存客户端的信息。

    自己的话:第一次会话和第二次会话相互之间会受到影响,因为无状态会话bean的实例可以被多个用户使用,那么第一次会话使用的bean实例可能会在第二次会话的时候被修改。

    无状态会话Bean,用@Stateless注解。

区别

(1)因为EJB容器不会对StatelessSession Bean的状态进行管理,所以它的性能要比Stateful Session Bean的好

(2)生命期的不同

    有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。
    无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

(3)有状态会话Bean的好处是,可以保存客户端的状态,所以客户端在后续访问的时候就可以少传递一些参数。而无状态会话Bean需要传递方法执行过程中需要的所有参数。

使用

    如果要频繁的访问,并且多次访问之间会共享一些信息,这时候应该使用有状态会话Bean。对于不经常使用的功能,可以使用无状态会话Bean。无状态会话Bean的使用要比有状态会话Bean的使用多。

猜你喜欢

转载自blog.csdn.net/u010121883/article/details/52043765