无状态会话bean不记录连接状态,较省资源,默认为此,一般如此;有状态会话bean会记录每一个jndi连接,较费资源,很少用.如果你不是有知道连接人的身份,用无状态的好了.
解决方案 »
- socket求助
- Socket读取数据问题
- lucene 索引用法讨论
- 急!在weblogic8.1下配置struts2.1.6出错
- 在线等待回复,中文乱码问题,附源码...
- 表单参数太多如何传递
- Struts+Hibernate中连接Sql2000的问题???急!!!
- 如何解决java导致的cpu资源耗尽而是机器长时间不能动弹?急......
- 如何整合apache2.0.48与tomcat5.0.16?(100分求apache和tomcat最新版本的整合方案)
- 关于EJB部署的问题 急 急 急!!!!!!!
- 请问在eclipse下怎么开发运行servlet?
- @@@ com.ibatis.struts.BeanActionException 这个异常是因为什么?
所以,使用stateless Session Bean时,不应该使用成员变量。
而Stateful session bean ,会把成员变量持久化。 这样多个客户端使用同一个Stateful Session Bean时,实例变量是相互独立的。
成员变量持久化是怎么回事?我访问一个无状态的会话bean,设置了一下它的成员变量值,又在另一个类再次访问这个bean,读取的成员变量值并没有前一个设置上的值,怎么能说它的成员变量会被多个客户端所共享呢。
不用2用3吗?现在还没有3的书啊
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)
可以在不同的方法调用间保持针对各个客户端的状态
与客户端的联系必需被维持;通常开销较大