根据我的理解,无状态会话 bean 用于编写业务逻辑。它们无法将数据存储在实例变量中,因为它们的实例由多个请求共享。所以它们看起来更像是 Singleton 类。然而,不同之处在于包含为每个请求创建(或从池中重用)无状态会话 bean 的单独实例。

经过谷歌搜索后,我可以找到 Java EE 规范说它们应该是单线程的推理。但我不明白为什么被指定为 单线程?

有帮助吗?

解决方案

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

如果 SLSB 被设计为线程安全,那么每个调用都会看起来像一个 servlet doGet/Post,其请求信息包含 Tx Context、Security Context 信息等。所以至少代码看起来很干净(取决于开发人员)。

其他提示

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

我记得原始 EJB 1.0 规范的评论中讨论过的推理。我会查看规范的目标部分。看 http://java.sun.com/products/ejb/docs.html 获取规格列表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top