EJB学习笔记三(有状态和无状态SessionBean的区别)

 

 1.前言

在EJB概述的博客中也曾提到过EJB3.0中的SessionBean的两种状态,下面呢,通过本篇博客深入的分析一下,两种状态的SessionBean到底有何区别。


 2.开发一个有状态的SessionBean

2.1、接口

<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package com.test;

public interface StateFulEjbBean {
	public void compute(int i);
	public int getResult();
}
</span></span>

2.2、实现类


<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package com.test;

import javax.ejb.Remote;
import javax.ejb.Stateful;

//有状态的SessionBean实现类
@Stateful
//远程访问接口
@Remote
public class StateFulEjbBeanImp implements StateFulEjbBean {

	private int state;
	public void compute(int i) {
		state=state+i;
	}

	public int getResult() {
		return state;
	}

}
</span></span>



 3.开发一个无状态的SessionBean

有状态和无状态SessionBean,在定义上,只不过是注解形式不一样而已,有状态的注解关键字是StateFul,无状态是StateLess

<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package com.test;

import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless
@Remote
public class StateLessEjbBeanImpl implements StateLessEjbBean{

	private int state;
	public void compute(int i) {
		state=state+i;
	}

	public int getResult() {
		return state;
	}

}
</span></span>


 4.简单测试

4.1、有状态客户端编写

下面通过一个客户端来分别调用一下,上述Demo中的有状态和无状态的SessionBean,调用方法和上一篇博客类似,就不再详细的介绍。

<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package com.test;

import javax.naming.InitialContext;
import javax.naming.NamingException;


public class StatefulEjbClient {

	public static void main(String[] args) throws NamingException {
		//如果不配置JNDI的话,需要在代码中书写如下
//		Properties props=new Properties();
	
		
		// 第一次会话
		InitialContext context = new InitialContext();
		StateFulEjbBean ejb1 = (StateFulEjbBean) context
				.lookup("StateFulEjbBeanImp/remote");

		System.out.println(ejb1.getResult());
		
		ejb1.compute(1);

		System.out.println(ejb1.getResult());
		
		
		//第二次会话,新的对象,新的会话,因为是有状态的,所以会创建新的对象,变量不是单例的
		StateFulEjbBean ejb2 = (StateFulEjbBean) context
				.lookup("StateFulEjbBeanImp/remote");
		
		

		System.out.println(ejb2.getResult());
		ejb2.compute(1);

		System.out.println(ejb2.getResult());
		ejb2.compute(1);

		
	}

}
</span></span>

4.2、测试有状态SessionBean

当把EJB部署到JBoss中,测试上述实例的时候,无论测试几次,结果都如下所示




4.3、测试无状态SessionBean

当把EJB项目部署到JBoss中,测试上述实例的时候,每次运行的结果不一样,有一个累加的过程,如下图



 4.4.两种状态的区别

1.关键字上一个是StateFul。另一个是StateLess

2.无状态的SessionBean有以下好处

EJB容器无须为每个客户端分配一个EJB实例(对于有状态的Session Bean而言,系统必须为每个客户端分配一个EJB实例),可以减少创建、维护EJB实例的系统开销

EJB容器无须维护EJB的内部状态,系统开销大大降低。

3.有状态的SessionBean使用场景

客户端数量比较有限 ,当客户端数量巨大时,那就意味着EJB容器要同时为何大量有状态的EJB,这将导致EJB容器的性能直线下降。因此,只有当客户端数量比较固定时,才可以考虑使用有状态的SessionBean

客户端与服务端之间的会话比较多。








 




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值