web里面,什么是无状态bean什么是有状态bean
不管是spring还是ejb都有这样一个概念,我刚开始以为无状态bean就是没有成员变量,后来发现不是那么回事。
ejb里面无状态的意思好像是说容器不为你保存变量的值,请问谁对这个比较了解的,说一说吧。
最好能有代码描述,尤其是无状态和有状态bean在什么场合使用。
[解决办法]
首先,无状态Bean(Stateless Beans)和有状态bean(Stateful Beans)都是Session Bean,都是服务器端提供的可以被调用的服务。而前者仅仅是提供服务的调用,而后者维护了一个会话状态,每一次的调用都使会话的状态发生改变,直到会话的结束(购物车就是这样的一个例子)。在调用stateless Beans时,每一次都要提供这次调用的所有的信息,但是速度相对较快,用于功能单一的服务调用。而调用stateful Bean时,可以每一次都提供部分信息,直到提交才完成整个会话,期间通过一个相应id号使得每一次调用与特定的stateful Bean关联。相对于stateless Beans来说,Stateful Beans速度较慢,还要使用一定的内存来维护状态,但是能够完成比较复杂的服务调用。
[解决办法]
一个bean没有成员变量,或者那个bean的成员变量也是无状态的bean,那么这个bean就是无状态的。顺便说明一下单利对象不一定是无状态的。
spring里面的singleton和ejb里面的stateless使用起来基本一样,但是他们在实现上还是有区别的。
prototype和stateful区别就较大了,ejb的stateful可以用来保存客户端的数据,比如说用来实现购物车;
spring的prototype是每次请求都会创建一个新的bean,请求结束也就没了。
[解决办法]
会话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
stesoCotx
3.旬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.rae
cet
I.remove
2.esinnet
s巧e soCotx2.jev
ebRmoe
3.jCet
ebrae
准备
图.. 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来访问数据表中代表这个月已经卖出的产品的行。..
[解决办法]
我只知道有状态bean(statefull)是为每个用户创建对象。
无状态bean(stateless)为所有用户创建一个对象。类似单例模式的感觉。
无状态的好处就是只建立一个对象,不耗资源,有状态的耗资源。大多数情况下还是用statefull.
我个人ejb用得不深,项目经验少,解释不到位。
[解决办法]
有状态的bean也有可能是 为所有用户只创建一个对象。就是说有状态的bean也有可能是单利的.
比如说下面这样
public class UserServiceImpl implements UserService {
private int saveTimes;//记录调用了多少次saveuser方法, 这个属性是有状态的
private UserDao userDao;//userdao也是无状态的
public synchronized void saveUser(User user) {
saveTimes++;
}
}
[解决办法]