为什么无状态会话bean是单线程的?

时间:2020-03-05 18:43:43  来源:igfitidea点击:

根据我的理解,无状态会话Bean用于编码业务逻辑。它们无法在其实例变量中存储数据,因为它们的实例被多个请求共享。因此,它们似乎更像是Singleton类。但是不同之处在于,它包含针对每个请求创建(或者从池中重用)无状态会话Bean的单独实例。

谷歌搜索之后,我可以找到Java EE规范说它们被认为是单线程的理由。但是我不知道为什么将指定为单个线程的原因?

解决方案

回答

由于TX上下文,SLSB是单线程的,Principal在调用时与Bean实例相关联。这些bean被池化,除非达到最大池大小,否则将在单独的线程中处理(取决于供应商)。

如果将SLSB设计为线程安全的,则每次调用都将看起来像一个servlet doGet / Post,其请求信息包含Tx Context,Security Context info等。因此,至少代码看起来是干净的(取决于开发人员)。

回答

无状态会话Bean是单线程的主要原因是使它们对于容器具有高度可伸缩性。容器可以对运行时环境进行很多简化的假设。第二个原因是使开发人员的工作更加轻松,因为开发人员不必担心其业务逻辑中的任何同步或者重新进入,因为永远不会在另一个线程上下文中调用Bean。

我记得在原始EJB 1.0规范的评论中讨论的推理。我将看一下规范的目标部分。有关规范的列表,请参见http://java.sun.com/products/ejb/docs.html。