站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题2.0无状态会话bean到底和有状态的有什么区别?

2.0无状态会话bean到底和有状态的有什么区别?

摘要: 2.0无状态会话bean到底和有状态的有什么区别?


我看书上写的,无状态的不能成员变量,无法保存成员变量的值,因此是无状态的,而有状态的却是可以有成员变更的。但我今天做个测试发现无状态的也可以有成品变量并且能够保持住值,请问,这两者到底有什么区别?


无状态会话bean不记录连接状态,较省资源,默认为此,一般如此;有状态会话bean会记录每一个jndi连接,较费资源,很少用.如果你不是有知道连接人的身份,用无状态的好了.


那么记录jndi连接有什么意义?


现在讨论ejb2.0有什么意义?都废弃的东西。用ejb2.0做过项目,效率奇低。


无状态的Session bean,不会把成员变量持久化。 这些成员变量会被多个客户端所共用。
所以,使用stateless Session Bean时,不应该使用成员变量。
而Stateful session bean ,会把成员变量持久化。 这样多个客户端使用同一个Stateful Session Bean时,实例变量是相互独立的。


to shendl:
成员变量持久化是怎么回事?我访问一个无状态的会话bean,设置了一下它的成员变量值,又在另一个类再次访问这个bean,读取的成员变量值并没有前一个设置上的值,怎么能说它的成员变量会被多个客户端所共享呢。


to ltshark:
不用2用3吗?现在还没有3的书啊


良少说的没错的,LZ
to shendl:
成员变量持久化是怎么回事?我访问一个无状态的会话bean,设置了一下它的成员变量值,又在另一个类再次访问这个bean,读取的成员变量值并没有前一个设置上的值,怎么能说它的成员变量会被多个客户端所共享呢。
------------------------------------
你的例子肯定有问题,SLSB的变量将被所有客户端共享,而SFSB的变量将针对各个客端保持不同的变量,我以EJB3举个例子(EJB2.X原理一样):

接口:
public interface Calculator{
int getI();
void setI(int i);
}
实现的SLSB(无状态session bean,采用EJB3的标注):
import javax.ejb.Stateless;
import javax.ejb.Remote;
@Stateless //注释为无状态
@Remote(Calculator.class) //注释为远程接口
public class CalculatorBean implements Calculator
{
private int i=0; //成员变量,无状态session bean将为客户端共享
//getter,setter方法,实现接口
public void setI(int i){
this.i=i;
}
public int getI(){
return this.i;
}
}
然后,写两个客户端,代码都一样,其中一个设置i为20,另外一个访问i并打印:
public class CalculatorClient2 {

public static void main(String[] args) throws Exception
{
InitialContext ctx = new InitialContext();
Calculator cb = (Calculator) ctx.lookup("CalculatorBean/remote");
cb.setI(20); //设置i为20
System.out.println(cb.getI());
}

}
打印:20
另一个直接访问:
public class CalculatorClient {

/**
* @param args
*/
public static void main(String[] args) throws Exception
{
InitialContext ctx = new InitialContext();
Calculator cb = (Calculator) ctx.lookup("CalculatorBean/remote");
System.out.println(cb.getI());
}

}
也打印:20
由此可见,i在各个客户端间是共享的.如果你把上面的例子中的@Stateless改为@Statefull,也就是改成有状态session bean,那么
CalculatorClient2将打印:20
而CalculatorClient打印:0
SFSB针对不同的客户端维护不同的i变量

SLSB与SFSB的主要区别:
1 无状态 (Stateless)
在不同方法调用间不保留任何状态
事务处理必须在一个方法中结束
通常资源占用较少;可以被共享(因为它是无状态的)
2 有状态 (Stateful)
可以在不同的方法调用间保持针对各个客户端的状态
与客户端的联系必需被维持;通常开销较大




可能是我那天的程序设置成stateful了,因此看不到。


↑返回目录
前一篇: 谁能教教我,如何写个简单的serlvet读确数据库的内容,然后用jsp显示出来!!!
后一篇: 请问EJB的问题??