0

我知道这已经被问过百万次了,但到目前为止它还没有回答我脑海中的问题,我认为最好用代码来理解,有人可以验证我的想法:

客户端中的无状态 bean:

public void work(){
    bean.work1();   <--- this uses instance 1 in App Server
    ...
    bean.work2();   <--- this can be instance 2 in App Server
}

客户端中的有状态 bean:

public void work(){
    bean.add_item(item); <------- this uses instance 1 in App Server
    ....
    bean.checkout();     <------- this uses instance 1 in App Server
}

销毁会话:

public void work(){
    ...
    bean = null;
}

来自Oracle文档

顾名思义,会话 bean 类似于交互式会话。会话 bean 不共享;它只能有一个客户端,就像交互式会话只能有一个用户一样。当客户端终止时,它的会话 bean 似乎也终止并且不再与客户端关联。

该状态在客户端/bean 会话期间保留。如果客户端移除 bean,会话结束并且状态消失。然而,这种状态的瞬态性质不是问题,因为当客户端和 bean 之间的对话结束时,不需要保留状态

如果以上是正确的,那么我的派生问题是,当 bean 引用设置为 null 时,App 服务器是否会丢弃有状态 bean 实例并创建新实例?我问这是因为:

  1. 我们向 bean 添加了项目,并将为新客户保留 bean,除非我们实现一个flush方法,但我认为这不是正确的方法。
  2. 如果在最佳实践中 bean 不应该改变自己的状态,即this.items在 bean 内部添加项目,我想不出更好的理由来使用 Stateful bean?
  3. “状态”是指 bean 实例本身吗?
4

1 回答 1

0

您对哪些 bean 实例可用于无状态/有状态会话 bean 的分析是正确的。

将该字段设置为 null 并没有真正做任何事情。要销毁有状态会话 bean,您需要调用 remove 方法(如果您使用的是 EJB 3,这意味着调用 annotated 方法@Remove)。

  1. 如果您指的是无状态会话 bean,则根本不应该在 bean 中存储状态。如果您指的是有状态会话 bean,flush 方法似乎是合理的,或者您可以将逻辑放入@Remove方法中(可能命名为 flush)。

  2. 改变状态很好。你是对的,保持状态是有状态会话 bean 的意图。

  3. 是的,但这也意味着与客户的关联。无状态会话 bean 可以清楚地将状态存储在成员变量中,但是由于不能保证客户端获得相同的实例,因此 EJB(而不是实例)没有真实状态。这也意味着无状态会话 bean 不应将客户端状态存储在成员变量中,因为没有实际用途。

于 2016-02-25T14:51:40.267 回答