当bean = null时,app服务器是否会丢弃有状态bean实例并创建新实例?

时间:2016-02-25 02:03:46

标签: java-ee ejb stateless-session-bean stateful-session-bean

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

客户端中的无状态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 doc

  

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

     

状态在客户端/ bean会话期间保留。如果客户端删除了bean,则会话结束并且状态消失。然而,状态的这种瞬态特性不是问题,因为当客户端和bean之间的对话结束时,就没有必要保留状态

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

  1. 我们向bean添加了项目,并将继续使用bean来为新客户服务,除非我们实施flush方法,但我认为这不是正确的方法。
  2. 如果在最佳实践中,bean不应该改变自己的状态,即在bean内部向this.items添加项目,我想不出更好的理由来使用有状态bean?
  3. 是&#34;州&#34;是指bean实例本身吗?

1 个答案:

答案 0 :(得分:0)

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

将字段设置为null并不会真正起作用。要销毁有状态会话bean,您需要调用remove方法(如果您正在使用EJB 3,这意味着调用带注释的方法@Remove)。

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

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

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