【EJB二】有状态SessionBean和无状态SessionBean
2016-05-02 19:37
429 查看
在EJB中SessionBean分为有状态和无状态两种。二者之间的区别到底在哪里呢?通过一个实例来总结他们之间的区别。
Stateful SessionBean
//接口,有状态 public interface StatefulEjb { void compute(int state); int getResult(); }
//实现类,有状态 @Stateful @Remote public class StatefulEjbBean implements StatefulEjb { private int state; public void compute(int i) { this.state=state+i; } public int getResult() { return state; } }
Stateless SessionBean
//接口,无状态 public interface StatelessEjb { void compute(int state); int getResult(); }
//实现类,无状态 @Stateless @Remote public class StatelessEjbBean implements StatelessEjb { private int state; public void compute(int state) { this.state+=1; } public int getResult() { return state; } }
打包后,开始编写客户端
Client
需要引入服务jar包和编写jndi.properties文件
//调用有状态SessionBean public class StatefulEjbClient { /** * @param args * @throws NamingException */ public static void main(String[] args) throws NamingException { InitialContext context=new InitialContext(); //第一次会话 StatefulEjb statefulEjb1=(StatefulEjb)context.lookup("StatefulEjbBean/remote"); System.out.println(statefulEjb1.getResult()); statefulEjb1.compute(1); System.out.println(statefulEjb1.getResult()); statefulEjb1.compute(1); System.out.println(statefulEjb1.getResult()); statefulEjb1.compute(1); System.out.println(statefulEjb1.getResult()); statefulEjb1.compute(1); System.out.println(statefulEjb1.getResult()); statefulEjb1.compute(1); System.out.println(statefulEjb1.getResult()); //第二次会话 StatefulEjb statefulEjb2=(StatefulEjb)context.lookup("StatefulEjbBean/remote"); System.out.println(statefulEjb2.getResult()); statefulEjb2.compute(1); System.out.println(statefulEjb2.getResult()); statefulEjb2.compute(1); System.out.println(statefulEjb2.getResult()); statefulEjb2.compute(1); System.out.println(statefulEjb2.getResult()); statefulEjb2.compute(1); System.out.println(statefulEjb2.getResult()); statefulEjb2.compute(1); System.out.println(statefulEjb2.getResult()); } }
无状态SessionBean同上,只需要把名字修改一下即可。 在测试时,每次重新利用JNDI进行一次bean查找,就意味着开启了两次客户端,调用了两个Bean实例。
执行结果
有状态的SessionBean:无状态的SessionBean:
第一次执行:
再执行一次:
比较总结
通过以上实例,我们发现,每次实例化一个ejb对象时,有状态情况下,每次会重新初始化对象状态,而无状态情况下,会延续之前对象的状态进行执行。 所以:我们发现有状态和无状态SessionBean之间最主要的区别是它们的**生命期**。 有状态(Stateful):每当客户端实例化一个ejb对象时,都会进行初始化,在调用期间(生存期内),对象会维持它的状态, 当调用结束时,状态也随之消失。即“有状态”。 无状态(Stateless):每当客户端实例化一个ejb对象时,会将这个对象放在一个"共享池"中,当这个对象生存期结束时,再有其他调用时, 会去共享池中直接找到这个对象进行调用,不会再重复初始化。即每个新的对象不会有专门儿属于自己的状态。即“无状态”。
相关文章推荐
- ZOJ 3195 LCA转RMQ
- python之路 之open
- 知问前端——自动补全UI
- uva 10534 (dp专组H题)
- SQLZOO(self join)writeup未完
- spring整合cxf开发webservice
- SEO内容文章标题优化心得
- Java基本类型、基本数据类型之间的转换
- HDOJ1263
- Swift编写Android应用程序入门
- Ubuntu 14.04 安装深度音乐的方法(下载速度极慢未成功)
- iOS UIKit:viewController之层次结构(1)
- 数据结构 并查集
- 【AKOJ】1198-排排队
- 编写高质量C代码一:数据
- 五角星自由变换和移动 & 结构体数组初始化 & DIRECTION
- BestCoder Round #82 (div.2)
- “不给力啊,老湿!”:RSA加密与破解
- 自然语言处理中N-Gram模型的Smoothing算法
- Docker的基本组成