日期:2014-05-20  浏览次数:20951 次

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(Stateless Beans)和有状态bean(Stateful Beans)都是Session Bean,都是服务器端提供的可以被调用的服务。而前者仅仅是提供服务的调用,而后者维护了一个会话状态,每一次的调用都使会话的状态发生改变,直到会话的结束(购物车就是这样的一个例子)。在调用stateless Beans时,每一次都要提供这次调用的所有的信息,但是速度相对较快,用于……

------解决方案--------------------
很多朋友对两种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.无状态的会话bean

B、实体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的监听者异步处理监听到的消息