不管是spring还是ejb都有这样一个概念,我刚开始以为无状态bean就是没有成员变量,后来发现不是那么回事。
ejb里面无状态的意思好像是说容器不为你保存变量的值,请问谁对这个比较了解的,说一说吧。
最好能有代码描述,尤其是无状态和有状态bean在什么场合使用。

解决方案 »

  1.   

    再问一个spring里面的bean作用域singleton和ejb里面的stateless,prototype和stateful是不是一个意思?
      

  2.   

    首先,无状态Bean(Stateless Beans)和有状态bean(Stateful Beans)都是Session Bean,都是服务器端提供的可以被调用的服务。而前者仅仅是提供服务的调用,而后者维护了一个会话状态,每一次的调用都使会话的状态发生改变,直到会话的结束(购物车就是这样的一个例子)。在调用stateless Beans时,每一次都要提供这次调用的所有的信息,但是速度相对较快,用于功能单一的服务调用。而调用stateful Bean时,可以每一次都提供部分信息,直到提交才完成整个会话,期间通过一个相应id号使得每一次调用与特定的stateful Bean关联。相对于stateless Beans来说,Stateful Beans速度较慢,还要使用一定的内存来维护状态,但是能够完成比较复杂的服务调用。
      

  3.   

    那stateful的状态是指成员变量还是什么?
    怎么维护?
    有木有多点的人来回答下,交流啊
      

  4.   

    一个bean没有成员变量,或者那个bean的成员变量也是无状态的bean,那么这个bean就是无状态的。顺便说明一下单利对象不一定是无状态的。spring里面的singleton和ejb里面的stateless使用起来基本一样,但是他们在实现上还是有区别的。prototype和stateful区别就较大了,ejb的stateful可以用来保存客户端的数据,比如说用来实现购物车;
    spring的prototype是每次请求都会创建一个新的bean,请求结束也就没了。
      

  5.   

    你说这个不全对,stateful他是保存了会话信息,但是他一直在服务端保存,不需要进行数据传输,所以他不需要数据传输的开销,而你stateless需要一直传递这个回话信息,通过方法参数来传递,所以他并不一定会比stateless慢,其实无所谓stateless还是stateful,关键看你实际情况!
      

  6.   

    很多朋友对两种session bean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息。仔细分析并用实践检验后,你会发现,事实恰好相反:有状态和无状态会话bean的本质区别是它们的生命期。首先解释一个下面要用到的概念--用户:session bean 的用户实际上就是直接调用ejb的类的实例,甚至是这个实例的某个方法。同一个类的不同实例对于session bean 来说是不同的用户。有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。无状态会话bean :bean 一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。实体bean:一个session bean 代表与客户程序的一个短暂的会话,而且可能执行数据库读写操作。一个session bean 可能会自己调用JDBC ,或者它可能使用entity bean 来完成此种调用。在后者这种情况下,这个session bean 是该entity bean 的客户。一个session bean 的域包含会话状态,而且是短暂的。如果服务器或者客户程序崩溃,该session bean 就丢失了。这种模式通常被用于像PL/SQL 这样的数据库程序设计语言上 。
    一个entity bean 代表一个数据库中的数据及作用于该数据的方法。在一个关系型数据库中的雇员信息表中,每一行都有一个bean 来代表。entity beans 是事务的,并且是长寿命的。只要数据留在数据库中,entity bean 就存在。这个模式可以被很容易地用于关系型数据库,而不仅限于对象数据库。
    Session beans 可以是有状态的,也可以是无状态的。一个有状态的session bean 包含代表客户程序的会话状态。该会话状态是该session bean 实例的域值加上这些域值所引用到的所有对象。有状态session beans 并不代表在一个持久数据存储中的数据,但是,它可以代表客户程序访问和更新数据。
    无状态session beans 没有用于某个特定客户程序的任何状态信息。它们通常被用于提供不保持任何特定状态的服务器端行为。无状态session beans 要求更少的系统资源。一个提供一种一般服务,或用于表示被存储的数据的一个被共享的视图的业务对象是无状态session bean的一个例子 。会话bean 和实体bean的选择:如果想要使你的项目扩展性更好通常这样处理:
    凡是涉及到数据库的就用实体Bean,然后定义一个会话Bean,客户必须通过会话Bean才能访问实体Bean,当然,如果你的查询要求返回的数据量很大,也可以直接利用会话BEAn访问数据库,不过,这并不是良好的设计。会话Bean与实体Bean有时候是很难选择的,就想选择.NET与Java一样,是个态度问题。原则上与数据库打交道的地方都应该采取实体Bean,但是实际采用中如果采取这种方式的,势必性能会很糟糕,所以实际中对于那些涉及到批数据量的操作时还要采取会话Bean。
    一般要结合你自己的项目的特点而采取相应的对策!如果数据量不大,可以考虑用实体bean,并且一般不会用实体bean来实现大量数据的查询,如模糊查询,实体bean在实际应用中一般用做删除,精确查询,更新,因为每一个实体bean都会在内存中占用相对较大的空间,所以如果较大的实体bean查询结果会直接导致服务器down机(虽然ejb容器一般都有钝化,激活功能)。通常都是用会话bean来通过datasource来直接操作数据库EJB 分为三类A、会话bean : 只针对特定的客户端      1.有状态的会话bean;       2.无状态的会话beanB、实体bean : 用户之间可以共享的bean      实体bean是:提供在数据库中数据的对象视图..·允许被多个用户共享存取访问
    。可以是长期存在.. (只要它存在于数据库中)
    。实体Bean,它的主键对象,以及它的远程引用将能跨.. EJB容器的宕机而
    存在实体Bean用于表示保存在持久数据存储机制中的实体,为这些实体提供面向
    对象的视图,如关系型数据库中的业务实体数据,或传统业务系统中的业务实体
    一个实体Bean描述一个持久存储备的商业对象。商业对象的例子如:消费者,订
    单和产品等。在J2E
    EESDK中持久存储设备是一个关系型数据库。最典型的情况是
    一个实体Bean又一个在地层数据库中有一个表相对应,而实体Bean的每一个实
    例对应表中的一行数据。实体Bean有一下特征:1)实体Bean可以幸免于故障..
    2)实体Bean实例是一个对应到数据库中的视图..
    3)几个实体Bean实例可能代表同一底层数据..
    4)实体Bean实例可以被收集并再利用C、消息驱动Bean:作为JMS(Java Messsage Service Java消息服务) API的监听者异步处理监听到的消息
    会话BEAN详解
    4.2会话.. Bean
    4.2.1什么是会话.. Bean
    会话.. Bean(会话.. Bean):根据.. EJB规范,一个会话.. Bean是:
    。代表单个客户端来执行
    。可以参与到事务处理中
    。不直接代表共享于数据库中的数据,但它能访问和更新这些数据
    。相对而言是短暂存在的..
    ·当EJB容器失效后就不存在-一客户端需要重新建立一个信新的会话对象来
    继续运算
    会话.. Bean可被视为客户端程序在服务器上的部分逻辑延伸,每会话.. Bean对
    象对应于特定的客户端,不能在多个客户端间共享。换句话说,会话.. Bean用于表
    示运行于服务器端的部分业务过程,作为客户端的代理,管理业务过程或任务,
    如客户对账户的借贷操作、汇率的计算,等等这些涉及逻辑、算法和工作流的种
    种任务。这些过程都是特定的客户行为,EJB根据这些过程在运行时创建过程实例、
    执行计算或者清除实例。..4.2.2会话.. Bean的分类
    根据状态管理模式的不同会话Bean可以分为两类:有状态.. (stateful)会话..
    Bean和无状态.. (stateles
    ss)会话Bean.1)有状态会话Bean
    一个对象的状态由它的成员变量.. (数据成员)的状态决定。有状态会话Bean
    的成员变量描述一个唯一的客户端一会话Bean的关联状态。因为客户端要与对应
    的会话B ea。进行对话,所以这种状态通常被叫做会话状态。当一个客户端与某一
    个有状态的会话E JB开启一个会话时,这个E JB为客户端维护了一个会话状态。
    这暗示着客户端向此E JB发出不同调用请求之间保证E JB的成员变量值不会丢失。
    会话状态在整个会话期间被保留。如果客户端运行结束或者删除对应的会话..
    Bean,这个会话就结束同时状态被清除。这种状态的短暂性并不是问题,相反,
    如果客户端和会话B ean的对话结束就不必要在保留会话的状态了。一旦客户端结
    束与有状态的会话E JB的交互后,.. EJB容器会自动销毁它。于是整个会话结束,并
    且此有状态的会话E JB所保存的状态数据会全部丢失。..2)无状态会话B ean
    无状态会话B ean并不为客户端保留会话状态。在客户端调用无状态会话B ean
    的方法时,对应会话B ean的数据成员会描述这个调用状态,但只在该方法调用期
    间保持这个状态。当方法调用结束,状态就被清除。除了在方法调用期间,所有
    同一个无状态会话B ean实例是等价的,可以被容器分配给任一客户端。因为无状态会话B ean可以同时支持多个客户端,所以能更好的支持应用程序
    的可数的大量客户端。很明显,对支持相同数量的客户端的应用程序,需要的无
    状态会话B ean会比有状态会话B ean要少。有时,E JB容器会在没有请求的时候把有状态会话B ean保存在内存(二级存
    储器S econdStorage)中。不管什么时候,没有请求时无状态会话B ean都不会被
    保存中。所以,无状态会话B ean会比有状态会话B ean有更高的性能。..4. 2.3会话日.. an的生命周期..
    1)有状态会话.. Bean的生存周期如下图所示:
    1.treate
    2.essinnet
    stesoCotx3.旬bC饱欲e
    图.. 4 -2有状态会话.. B ean的生存周期会话.. Bean的生存周期开始于客户端对create方法的调用。随后,EJB容器
    调用组件类的setSes
    会话.. Bean的生存周期开始于客户端对create方法的调用。随后,EJB容器
    调用组件类的setSeionContext方法和ejbCreate方法。现在,E丁B进入就绪状
    态,可以进行业务方法的用。
    对处于就绪状态的EJB,容器可以决定是否将其从内存中转移到二级存储器,然后调用ejbPas
    ssivate方法,使EJB进入钝化状态。当客户端对处于钝化状态的..
    EJB调用业务方法时,容器激活EJB,将其转移到就绪状态,然后调用EJB的..
    ejbActivate方法。当客户端调用remove方法,EJB容器调用EJB的ejbRemove方法,然后,EJB
    完成其生存周期,可以对其进行垃圾回收。
    客户端代码对有状态会话.. Bean生存周期的控制只能通过create和remove方
    法。其他方法由EJB容器进行调用。..2)无状态会话Bean的生存周期
    因无状态会话Bean不会进行被钝化操作,因此,其生存周期只有两个阶段,
    不存在和就绪状态。
    下图表示无状态会话.. Bean的生存周期:l.raecetI.remove2.esinnets巧e soCotx2.jevebRmoe3.jCetebrae准备
    图.. 4-3无状态会话.. Bean的生存周期..4.2.4会话Bea。的使用场合
    通常,在出现以下几种情况时需要用会话Bean:
    1)在任何给定时间,只有一个客户端访问这个Bean的实例。..
    2)Bean的状态并不需要持久保存,只在一个时间段内保持。
    在以下情况下,建议采用有状态会话Bean:
    1)Bean需要描述一个于特定客户端的会话状态2)Bean需要在客户端的多个方法调用之间保存调用信息..
    2)Bean需要在客户端的多个方法调用之间保存调用信息..
    4)在调用接口里,Bean管理很多企业Bean的工作流。
    在以下情况下,为了得到更高的性能应该选择无状态会话Bean:
    1)Bean的状态不包含客户端相关的数据..
    2)在一个单一方法调用中,Bean己经可以为客户端完成所需要的工作。例如
    你可以用无状态会话Bean发一封邮件确认网络订单。..
    3)Bean需要从数据库获取一些客户端经常访问的只读数据。例如可以用这样
    的Bean来访问数据表中代表这个月已经卖出的产品的行。..
      

  7.   


    在POJO里面,成员变量无状态的怎么表示?谁能贴点代码出来看看?
      

  8.   

    我只知道有状态bean(statefull)是为每个用户创建对象。
    无状态bean(stateless)为所有用户创建一个对象。类似单例模式的感觉。无状态的好处就是只建立一个对象,不耗资源,有状态的耗资源。大多数情况下还是用statefull.
    我个人ejb用得不深,项目经验少,解释不到位。
      

  9.   

    上代码最好了,不光是ejb的,还有别的框架下的代码都可以
      

  10.   

    有状态的bean也有可能是 为所有用户只创建一个对象。就是说有状态的bean也有可能是单利的.
    比如说下面这样public class UserServiceImpl implements UserService {    private int saveTimes;//记录调用了多少次saveuser方法, 这个属性是有状态的    private UserDao userDao;//userdao也是无状态的
         
         public synchronized void saveUser(User user) {
            saveTimes++;
        }
    }
      

  11.   

    按你的意思是如果方法里面对成员变量进行修改了就是有状态的么?如果我有个方法
    public void methodA(){
        if(userDao != null){
            userDao = new UserDaoImpl();
        }
    }
    那这个时候userDao是有状态还是无状态?按有状态bean的定义是web容器会保存bean的状态,那在spring里面,每次请求prototype bean都会创建一个新的实例,而请求结束后这个实例是会销毁的,这样无所谓保存不保存bean的状态了,因为也不可能能访问被保存的状态了,那是不是说prototype bean不可能是有状态的呢?期待有人解答。
      

  12.   


    你把spring的prototype比作成了ejb中的stateful session bean 了。
    ejb中的stateful指的是有状态会话bean, 注意 “会话” 2个字。当然可以说spring的prototype是有状态的,它可以保存一次请求的状态啊,典型的如struts2的action,难道说不是有状态的吗?
      

  13.   

    同样的道理pring的singleton也可以有状态啊,只是它的状态可以被大家共享而已
      

  14.   

    越来越迷糊了,可能快到达事物的本质了,黎明前的黑暗吧。谁能继续解释下为什么要分有状态和无状态的bean?通过这个问题应该能更好的理解有状态和无状态的含义。
      

  15.   

    session bean是代表客户应用和EJB容器之间的会话,spring里面的bean是实现业务逻辑
    除了这方面的区别,按我理解,认为prototype bean和stateful seesion bean是差不多的,都是每次“请求”都会产生一个新的实例
      

  16.   

    不对,session bean也要实现自己的商业逻辑,也就是业务逻辑
      

  17.   

    首先,无状态Bean(Stateless Beans)和有状态bean(Stateful Beans)都是Session Bean,都是服务器端提供的可以被调用的服务。而前者仅仅是提供服务的调用,而后者维护了一个会话状态,每一次的调用都使会话的状态发生改变,直到会话的结束(购物车就是这样的一个例子)。在调用stateless Beans时,每一次都要提供这次调用的所有的信息,但是速度相对较快,用于功能单一的服务调用。而调用stateful Bean时,可以每一次都提供部分信息,直到提交才完成整个会话,期间通过一个相应id号使得每一次调用与特定的stateful Bean关联。相对于stateless Beans来说,Stateful Beans速度较慢,还要使用一定的内存来维护状态,但是能够完成比较复杂的服务调用。
      

  18.   

    大家可以看看我写的这篇博客
    http://blog.csdn.net/richard_2010/archive/2010/11/01/5980051.aspx
    结合了大家的回复写出了对Stateless和Stateful会话bean的认识。