您的位置:首页 > 其它

EJB 中stateless、stateful 会话bean的区别

2013-03-01 13:45 316 查看
对于很多EJB的初学者,很多时候对有状态、无状态会话bean有一些误解。我给大家简单的介绍一下

现实中,很多朋友对两种session bean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息。仔细分析并用实践检验后,你会发现,事实恰好相反:

有状态和无状态会话bean的本质区别是它们的生命期。

首先解释一个下面要用到的概念--用户:session bean 的用户实际上就是直接调用ejb的类的实例,甚至是这个实例的某个方法。同一个类的不同实例对于session bean 来说是不同的用户。

1)有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。生命周期我们可以用web中context去简单认识,比如session、request等。在这个生命周期内,用户只会得到一个特定的stateful会话bean。

2)无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

这两种bean的使用场合简析:

1)有状态会话bean:用于跟踪用户数据,它可以在分布式中被缓存和传递,只要生命周期未被销毁(如session会话,前提是此会话bean被session会话管理),那么此bean可以在应用中随时获取,且数据时被同步更新的。。它就像你的“妻子”,你要你还“爱她”,她会随你“一生”

场合:用户登录权限切片控制,购物车等

2)无状态会话bean:这里你需要用servlet的思想去认识它,它就想servlet一样,为上层调用提供服务,并且是线程池的形式存在。当服务调用结束(如:获取web 服务,查询站点数据统计),无状态会话bean可能被销毁但也能继续存在,取决于线程池饱和度,但它不会为你保存任何和你的调用有“个人私情”的数据。你就认为他是一个servlet,它是提供共享服务的,它不是“老婆”,更像给你送邮件的“邮递员”,你们直接的交易,只是在你需要的时候,并以及结束。

现在你明白了吗??别搞混了额,别把“邮递员”当“老婆”,但更不希望你把“老婆”当“邮递员”。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: