【EJB学习笔记】——有状态的会话Bean和无状态的会话Bean
来源:互联网 发布:颂党恩 知党史 征文 编辑:程序博客网 时间:2024/05/08 21:06
EJB中的会话Bean(Session Bean)分为有状态的(Stateful)会话Bean和无状态的(Stateless)会话Bean。
对象的状态是由其实例变量(即成员变量)的值组成的
有状态的会话Bean:每次访问都会为用户分配一个独立的bean,在用户的生存周期内,bean始终为当前用户保存信息(用户的状态),用户访问结束时,bean的生存周期也随之结束。有状态会话Bean定义的方式是在类头使用注解@Stateful。
无状态的会话Bean:bean的成员变量保存的信息是所有客户端共享的,不是专门为单独的客户端而保留的。无状态会话Bean定义的方式是在垒头使用注解@Stateless。
举例说明
有状态的会话Bean例子:
接口
public interface StatefulEjb {public void compute(int i);public int getResult();}
EJB实现类
@Stateful@Remotepublic class StatefulEjbImpl implements StatefulEjb { private int state; public void compute(int i) { state=state+i; } public int getResult() { return state; }}
客户端调用
public class StatefulEjbClient{ public static void main(String[] args) throws Exception { InitialContext context=new InitialContext(); StatefulEjb statefulEjb1=(StatefulEjb)context.lookup("StatefulEjbImpl/remote"); for(int i=0;i<10;i++){ statefulEjb1.compute(1); System.out.println("statefulEjb1:"+statefulEjb1.getResult()); } StatefulEjb statefulEjb2=(StatefulEjb)context.lookup("StatefulEjbImpl/remote"); for(int i=0;i<5;i++){ statefulEjb2.compute(1); System.out.println("statefulEjb2:"+statefulEjb2.getResult()); } } }
执行结果
statefulEjb1:1statefulEjb1:2statefulEjb1:3statefulEjb1:4statefulEjb1:5statefulEjb2:1statefulEjb2:2statefulEjb2:3statefulEjb2:4statefulEjb2:5
由执行结果可以发现,客户端的两个实例分别调用服务端的有状态会话Bean,每次执行时,客户端都“独享”一个EJB实例,每次调用与其他调用之间的数据并不桐乡,互相独立,互不冲突。
无状态的会话Bean例子
接口
public interface StatelessEjb {public void compute(int i);public int getResult();}
EJB实现类
@Stateless@Remotepublic class StatelessEjbImpl implements StatelessEjb{ private int state; public void compute(int i) { state=state+i; } public int getResult() { return state; }}
客户端调用
public class StatelessEjbClient{ public static void main(String[] args) throws Exception { InitialContext context=new InitialContext(); StatelessEjb statelessEjb1=(StatelessEjb)context.lookup("StatelessEjbImpl/remote"); for(int i=0;i<10;i++){ statelessEjb1.compute(1); System.out.println("statefulEjb1:"+statelessEjb1.getResult()); } StatelessEjb statelessEjb2=(StatelessEjb)context.lookup("StatelessEjbImpl/remote"); for(int i=0;i<10;i++){ statelessEjb2.compute(1); System.out.println("statefulEjb2:"+statelessEjb2.getResult()); } System.out.println(statelessEjb1==statelessEjb2); } }
执行结果
statefulEjb1:1statefulEjb1:2statefulEjb1:3statefulEjb1:4statefulEjb1:5statefulEjb2:6statefulEjb2:7statefulEjb2:8statefulEjb2:9statefulEjb2:10false
由执行结果可以发现,客户端第一个实例statelessEjb1调用时,调用了5次,state的值增加到5;第二个实例statelessEjb2调用时,调用了5次,state的值从5开始增加,一直增加到10。由此可见,这两个实例调用无状态的会话Bean时,这10次调用的其实是一个EJB实例,实例的成员变量也是共享的。
总结
综上所述,有状态会话Bean可以保存用户状态,但每个用户访问都会实例化一次,会大大降低系统;无状态会话Bean可以被无限复用,性能比较高,但却不能保证保存每个用户的状态。各有利弊。
【 转载请注明出处——胡玉洋《EJB——有状态的会话Bean和无状态的会话Bean》】
- 【EJB学习笔记】——有状态的会话Bean和无状态的会话Bean
- EJB——有状态的会话bean和无状态的会话bean
- EJB有状态和无状态会话Bean的区别
- EJB有状态的会话Bean和无状态的会话Bean的区别
- EJB中有状态会话Bean 和 无状态会话Bean 的区别
- EJB中有状态会话Bean 和 无状态会话Bean 的区别
- EJB会话bean,无状态会话bean和有状态会话bean
- EJB 有状态会话bean无状态会话bean详解
- 状态会话Bean和无状态会话Bean的区别
- 关于有状态和无状态会话bean的解释
- 关于有状态和无状态会话bean的解释
- 关于有状态和无状态会话bean的解释
- 关于有状态和无状态会话bean的解释
- 关于有状态和无状态会话bean的解释
- 有状态和无状态会话bean的区别
- EJB编程中有状态会话Bean和无状态会话Bean
- EJB系列(三)--有状态会话Bean和无状态会话Bean
- 关于无状态会话bean和有状态会话bean
- 也谈BIO | NIO | AIO (Java版)
- Unity3D 一键更换场景物体
- Alluxio源码分析定位策略:指定主机策略SpecificHostPolicy
- items 排序 0
- grunt的一些注意事项
- 【EJB学习笔记】——有状态的会话Bean和无状态的会话Bean
- Android Volley完全解析
- HashMap的工作原理
- 数据挖掘领域十大经典算法
- mysql 整理
- Eclipse上GIT插件EGIT使用手册
- XAudio2学习之IXAudio2VoiceCallback回调
- LeetCode 338 Counting Bits(位运算)
- mybatis如何防止sql注入