会话bean的会话状态

csc*_*aba 8 java-ee ejb-3.0 java-ee-6

我正在读一本关于Java EE 6的书,我遇到了以下几个部分:

"无状态:会话bean在方法之间不包含会话状态,任何实例都可以用于任何客户端."

"有状态:会话bean包含会话状态,必须在单个用户的方法中保留."

"会话状态"是什么意思?有人用现实世界的例子来解释它吗?

提前致谢.

II.为什么豆类的这种分类如此重要?无论是正确的解释还是初学者(乍看之下)都没有说明任何事情.所以,多亏了你,我得到了逻辑上的区别,但为什么这种行为如此重要呢?

Ren*_*nan 12

在最基本的情况下,"会话状态"是指实例字段的值.

对于无状态会话bean,容器不保证后续方法调用将使用相同的EJB实例(来自池),因此您不能假设在调用bean方法时放置的值在调用时仍然存在方法再次(或bean的另一种方法).

对于有状态会话bean,容器保证后续调用将使用相同的EJB实例,因此您可以保留实例字段值.

举个例子,假设你有一个带有increment()和retrieve()方法的bean.增量会增加存储值,并且retrieve会获取当前存储的值.

对于无状态会话bean,如果你调用increment()方法5次,则无法保证当你执行retrieve()时,你将获得一个5.它将由容器分​​配给它的EJB你的来电.因此,如果为您分配了一个新的EJB实例,那么您将获得零.容器也可能没有清理你的EJB实例,所以有可能获得5 - 但是不能保证.

对于有状态会话bean,如果您调用increment方法5次,则在检索该值时,您将得到一个5.容器保证您第一次调用时使用的EJB将用于所有后续调用.


ane*_*rgy 5

一个对话状态的真实例子是购物车。用户可以将多件商品一一添加到购物车中,然后调用结帐。所有添加的时间都会在那里

假设购物车是有状态的,即它将保持对话状态。

cart.add(item1);  // suppose cart keep tracks of item by adding it to ArrayList
cart.add(item2);

cart.checkOut();    // at this stage both item1 and item2 would be there in ArrayList.
Run Code Online (Sandbox Code Playgroud)

如果购物车是无状态的,则每次调用都将独立于之前的调用,并且在结帐时它可以什么都没有。

对于您的第二点,由于两种 bean 的行为不同,因此有必要进行区分。维护状态需要资源,因此有状态 bean 不像无状态 bean 那样可扩展。