不管是spring还是ejb都有这样一个概念,我刚开始以为无状态bean就是没有成员变量,后来发现不是那么回事。
ejb里面无状态的意思好像是说容器不为你保存变量的值,请问谁对这个比较了解的,说一说吧。
最好能有代码描述,尤其是无状态和有状态bean在什么场合使用。
ejb里面无状态的意思好像是说容器不为你保存变量的值,请问谁对这个比较了解的,说一说吧。
最好能有代码描述,尤其是无状态和有状态bean在什么场合使用。
解决方案 »
- JSON与对象相互转换问题
- java 锁
- java调试异常:org.eclipse.core.runtime.CoreException
- 新手发问:关于一对多的实现问题,请大家帮助!!!
- Tapestry4+spring+hibernate 工程报错:Session is currently disconnected
- 上传图片时不能复制到指定文件夹
- html:submit标签提交完后怎么将里面的值清空
- hibernae3如何调用存储过程
- Tomcat与Oracle冲突的问题
- spring拦截 session 为空 网页跳转不过去
- 请问如何使用jfreechart生成这样的图形?
- jsp发表文章时怎么像文章中插入图片???急求。。。
怎么维护?
有木有多点的人来回答下,交流啊
spring的prototype是每次请求都会创建一个新的bean,请求结束也就没了。
一个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来访问数据表中代表这个月已经卖出的产品的行。..
在POJO里面,成员变量无状态的怎么表示?谁能贴点代码出来看看?
无状态bean(stateless)为所有用户创建一个对象。类似单例模式的感觉。无状态的好处就是只建立一个对象,不耗资源,有状态的耗资源。大多数情况下还是用statefull.
我个人ejb用得不深,项目经验少,解释不到位。
比如说下面这样public class UserServiceImpl implements UserService { private int saveTimes;//记录调用了多少次saveuser方法, 这个属性是有状态的 private UserDao userDao;//userdao也是无状态的
public synchronized void saveUser(User user) {
saveTimes++;
}
}
public void methodA(){
if(userDao != null){
userDao = new UserDaoImpl();
}
}
那这个时候userDao是有状态还是无状态?按有状态bean的定义是web容器会保存bean的状态,那在spring里面,每次请求prototype bean都会创建一个新的实例,而请求结束后这个实例是会销毁的,这样无所谓保存不保存bean的状态了,因为也不可能能访问被保存的状态了,那是不是说prototype bean不可能是有状态的呢?期待有人解答。
你把spring的prototype比作成了ejb中的stateful session bean 了。
ejb中的stateful指的是有状态会话bean, 注意 “会话” 2个字。当然可以说spring的prototype是有状态的,它可以保存一次请求的状态啊,典型的如struts2的action,难道说不是有状态的吗?
除了这方面的区别,按我理解,认为prototype bean和stateful seesion bean是差不多的,都是每次“请求”都会产生一个新的实例
http://blog.csdn.net/richard_2010/archive/2010/11/01/5980051.aspx
结合了大家的回复写出了对Stateless和Stateful会话bean的认识。