有状态会话Bean和无状态会话Bean的区别

原创 2007年09月29日 15:02:00

    Session   Bean   主要的目的是让程序开发者将逻辑层抽离;
    Entity   Bean   主要是资料组件,  Entity   Bean   主要的目的,在于提供资料,也就是说程序设计师可以将   Entity   Bean   当程序资料;
     Message   Driven   Bean   与   Session   Bean   或是   Entity   Bean   均不相同,一般   Session   Bean   或是Entity   Bean   都可以让使用者主动触发,但是   Message   Driven Bean   主要的目的在于反应   Message   Queue   中的事件。也就是当   Message   Queue   中有讯息传入时,   Message   Driven   Bean   可以主动被触发,做出相对应的反应。


有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别
  1   无状态   (Stateless)   
      在不同方法调用间不保留任何状态   。
      事务处理必须在一个方法中结束   。
      通常资源占用较少;可以被共享(因为它是无状态的)  。
      无状态Bean不会"专门"保存客户端的状态----(需要强调“专门”是因为无状态会话Bean也会有成员变量,有成员变量就可以保存状态,但它不会专门为特定的客户端保存状态。)。
      ----你对ENTITY   BEAN的数据操作不会被容器维护,当其他的用户要用ENTITY   BEAN时,里面的数据不
会被钝化到服务器的磁盘上。也就是被保存起来。

  2   有状态   (Stateful)   
      可以在不同的方法调用间保持针对各个客户端的状态   。
      与客户端的联系必需被维持;通常开销较大  。
      有状态会话Bean会保存客户端的状态 。
      --你对ENTITY   BEAN的数据操作会被容器维护起来,当其他的用户要用你正在使用的ENTITY   BEAN时,里面的数据会被钝化到服务器的磁盘上,例如网上的购物车。

区别的根本原因
这与无状态会话Bean和有状态会话Bean的运行原理是相关的。
对于有状态会话Bean来说,只要有客户端发送对有状态会话Bean的访问,服务器都会创建一个会话Bean实例与该客户端对应,这样这个实例与这个客户端就是一一对应的。如果客户端在Bean实例中保存了信息,之后还可以使用。
对 于无状态会话Bean来说,服务器端会维持一个实例池,创建好若干个实例对象供客户端调用。当从客户端发送创建会话Bean的请求时,并不一定会真的创建 EJB,多数情况下是从实例池中得到一个实例,用完之后重新放回实例池。如果下次再访问,再从实例池中取出一个实例使用,并不一定是上次的实例。即使两次 访问使用的是同一个实例,在两次访问之间也有可能有其他的客户端访问了该实例。所以,并不能保证在多次访问之间的信息会被保存。所以,无状态会话Bean 不会专门保存客户端的信息。
各自的优缺点
因 为有状态会话Bean需要保存特定客户端的信息,一个客户端对应一个实例,既是在当时客户端有连接没有访问的情况下,也要为这个客户端保留这个实例。这样 随着客户端数量的增加,服务器端需要创建的实例的数量也在增加,增加到一次程度对服务器的性能就会有一定的影响。为了不对服务器的性能产生影响,通常服务 器会进行一些优化。当客户端的数量超过某个值之后,就不创建新的实例。虽然不创建新的实例,还是需要对用户响应,这时候就采用共享实例的方式。会查看哪个 实例虽然处于连接状态,但是没有访问,然后把这个实例的状态保存起来,使用这个实例为新的请求服务,对于原来的客户端来说,称为挂起。如果原来的客户端又 发送请求了,会重新查找一个空闲的实例并且把已经保存好的状态恢复回来,这个过程称为激活。所以在有状态会话Bean的访问过程,经常会发生查找实例,激 活挂起等操作,所以效率比较低。
而发送对无状态会话Bean的请求的时候,可以随便取一个空闲的实例为客户端服务,所以效率比较高。
有状态会话Bean的好处是,可以保存客户端的状态,所以客户端在后续访问的时候就可以少传递一些参数。而状态会话Bean需要传递方法执行过程中需要的所有参数。
如何选择
根据上面分析的有状态会话Bean和无状态会话Bean的优缺点。如果要频繁的访问,并且多次访问之间会共享一些信息,这时候应该使用有状态会话Bean。对于不经常使用的功能,可以使用无状态会话Bean。无状态会话Bean的使用要比有状态会话Bean的使用多。

    

什么时候使用有状态会话bean

首先你应该清楚Session bean在服务器上是怎么样被创建以及管理的。拿无状态会话bean来说服务器在实例池中维护了它的很多实例。每次客户端请求的时候任意一个无状态的会话bean都可能会被选择出来...
  • beijiguangyong
  • beijiguangyong
  • 2014年11月27日 17:37
  • 2143

有状态会话bean

在会话bean综述中,描述了无状态和有状态bean的区别在于客户端和服务器之间交互形式不同。对于无状态会话bean,交互的开始和结束都在同一个方法中。有时客户端需要发出多个服务请求(需要调用多个方法)...
  • beijiguangyong
  • beijiguangyong
  • 2014年11月04日 22:27
  • 2223

JAVAEE7 有状态会话bean项目

  • 2015年12月18日 10:11
  • 3.24MB
  • 下载

EJB有状态的会话Bean和无状态的会话Bean的区别

在EJB里面,会话Bean分为两种,一种是有状态的会话Bean,另一种是无状态的会话Bean,本节主要讲解一下两者之间的区别。        对于有状态的会话Bean,这种情况属于,服务端与你单独开...
  • zc474235918
  • zc474235918
  • 2016年02月18日 16:59
  • 1592

无状态会话bean(1)---定义

无状态会话bean用于完成在单个方法的生命周期内的操作。无状态bean可以实现许多业务操作,但是每个方法都不能假定任何其他的方法会在它之前调用。这听起来像是无状态的bean的一个局限。但是这是迄今为止...
  • beijiguangyong
  • beijiguangyong
  • 2014年10月31日 23:24
  • 2471

J2EE中 实体BEAN和会话BEAN的区别

    一个session bean 代表与客户程序的一个短暂的会话,而且可能执行数据库读写操作。一个session bean 可能会自己调用JDBC ,或者它可能使用entity bean 来完成此...
  • arui319
  • arui319
  • 2005年04月08日 19:07
  • 5087

EJB中有状态会话Bean 和 无状态会话Bean 的区别

session  Bean:分有状态会话Bean和无状态会话Bean两种,主要目的是提供程序逻辑层;Entity  Bean:资料组件,主要目的是提供程序资料;下面主要对Session  Bean讨论...
  • bo_hai
  • bo_hai
  • 2010年12月31日 11:08
  • 2421

有状态bean和无状态bean是在说什么

http://www.iteye.com/topic/959751 http://www.iteye.com/topic/960532 一个类的内部状态创建后,在整个生命期间都不会发生变化...
  • bingjing12345
  • bingjing12345
  • 2013年08月06日 17:44
  • 10065

Spring Bean Scope 有状态的Bean 无状态的Bean

 在Spring的Bean配置中,存在这样两种情况:  当然,scope的值不止这两种,还包括了request,session 等。但用的最多的还是singleton单态,prototype多态。s...
  • anyoneking
  • anyoneking
  • 2010年01月12日 16:54
  • 10385

有状态会话bean与无状态会话Bean的区别

有状态会话Bean和无状态会话Bean的区别 状态通常理解为对象的属性,那么无状态就是没有属性,有状态就是有属性,这种理解是不正确的。 这里的无状态确实与属于相关,但有状态会话Bean和无状态会话...
  • u011606984
  • u011606984
  • 2013年08月06日 11:49
  • 932
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有状态会话Bean和无状态会话Bean的区别
举报原因:
原因补充:

(最多只允许输入30个字)