关于java:为什么无状态会话bean是单线程的?

关于java:为什么无状态会话bean是单线程的?

Why stateless session beans are single threaded?

根据我的理解,无状态会话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。


推荐阅读