Stateless和Stateful会话bean之间的区别

时间:2012-01-31 09:03:04

标签: ejb-3.0

我知道有状态bean在不同的实例方法调用之间保持对话会话,但是无状态不会。我的问题,假设我有一个像下面这样的无状态bean实现

import javax.ejb.Stateful;
import javax.ejb.Stateless;

import com.tata.ejb3.data.HelloEJBInterface;

@Stateless
public class ValueEJB implements ValueEJBInterface{

    private int value;
    @Override
    public int getValue() {
        return this.value;
    }

    @Override
    public void setValue(int value) {
        this.value = value;
    }
}

我有我的bean客户端(一个servlet),它启动bean调用,如下所示

@EJB(mappedName="E/ValueEJB /remote")
ValueEJBInterface value;

....

value.setValue(250);
System.out.println(value.getValue());//This statement prints the value 250

....

根据我的理解,因为我的bean是无状态bean,所以它不应该以值250显示。

私有int值;是一个即时变量,如果一个无状态方法设置其值,则该值将在方法exit上过期。但是在这里,即使通过我的第二个方法调用,我也可以得到值'250'。这是违反无国籍概念的吗?我缺少什么吗?

3 个答案:

答案 0 :(得分:5)

调用不同方法时Stateful v Stateless bean行为的区别。


STATEFUL:在有状态Bean上调用不同的方法时,会创建不同的bean实例。

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingStatefulThing();

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingNothingStatefulThing();

***Output: Note the creation of separate objects.***

INFO: Calling doingStatefulThing...com.myeclipseide.ejb3.stateful.**MyStatefulBean@2fe395**

INFO: Calling doingNothingStatefulThing...com.myeclipseide.ejb3.stateful.**MyStatefulBean@81cfcb**

STATELESS:在无状态Bean上调用不同的方法时,会合并bean,因此不会创建bean的新实例。

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doSomething(); 

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doNothing();

***Output: Note the reuse of he bean object.***

INFO: Doing something ...com.myeclipseide.ejb3.stateless.**MyBean@213b61**

INFO: Doing Nothing ...com.myeclipseide.ejb3.stateless.**MyBean@213b61**

答案 1 :(得分:2)

有趣的问题,基本上你是完全正确的。我做了一些研究,一般的建议是:“期望你的bean在每次方法调用后忘记一切......”(page 81)。此外,根据该资源,负责维护无状态会话Bean状态的算法是容器/供应商特定的。因此容器可以选择在方法执行后销毁,重新创建或清除实例。

您可以创建一个多线程测试,看看它在多个客户端客户端的行为方式。

答案 2 :(得分:2)

没有违反任何概念。这是因为容器从池中挑选了相同的bean实例来提供其他请求。

无状态豆被汇集在一起因此,它们比有状态的bean具有性能优势,它们的主要目的是处理而不保持任何状态。

敏感或用户特定数据不应存储在无状态bean的实例变量中。它们应广泛用于处理数据而不考虑任何状态。

可以在here中引用容器处理的生命周期事件。