我知道这已被问过百万次了,但到目前为止它还没有回答我脑子里的问题,我认为最好在代码中理解,有人可以验证我的想法:
客户端中的无状态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实例并创建新实例?我问这是因为:
flush
方法,但我认为这不是正确的方法。this.items
添加项目,我想不出更好的理由来使用有状态bean?答案 0 :(得分:0)
您对哪些bean实例可用于无状态/有状态会话bean的分析是正确的。
将字段设置为null并不会真正起作用。要销毁有状态会话bean,您需要调用remove方法(如果您正在使用EJB 3,这意味着调用带注释的方法@Remove
)。
如果你指的是无状态会话bean,你根本不应该在bean中存储状态。如果您指的是有状态会话bean,则刷新方法似乎是合理的,或者您可以将逻辑放在@Remove
方法中(可能名为flush)。
改变状态很好。保持状态是有状态会话bean的意图是对的。
是的,但这也意味着与客户的关联。无状态会话bean可以清楚地将状态存储在成员变量中,但由于不保证客户端获得相同的实例,因此EJB(不是实例)没有实际状态。这也意味着无状态会话bean不应该在成员变量中存储客户端状态,因为没有实际用途。