根据我的理解,无状态会话bean用于编写业务逻辑。它们无法在实例变量中存储数据,因为它们的实例由多个请求共享。所以他们似乎更像是单身人士课程。但是,区别在于包含为每个请求创建(或从池中重用)无状态会话bean的单独实例。
谷歌搜索后,我可以找到Java EE规范说它们被认为是单线程的原因。但我不明白为什么指定为单线程?
答案 0 :(得分:5)
由于TX Context,SLSB是单线程的,Principal在调用时与bean实例相关联。这些bean是合并的,除非达到最大池大小在单独的线程中处理(依赖于供应商)。
如果SLSB设计为线程安全,则每个调用看起来都像servlet doGet / Post,其请求信息包含Tx上下文,安全上下文信息等。因此,至少代码看起来很干净(取决于开发人员)。
答案 1 :(得分:4)
无状态会话bean是单线程的主要原因是使它们对容器具有高度可伸缩性。容器可以对运行时环境做出许多简化的假设。第二个原因是让开发人员的生活更轻松,因为开发人员不必担心他的业务逻辑中的任何同步或重新进入,因为bean永远不会在另一个线程上下文中调用。
我记得原始EJB 1.0规范的评论中讨论的原因。我会看一下规范的目标部分。有关规范列表,请参阅http://java.sun.com/products/ejb/docs.html。