6

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

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

4

2 回答 2

5

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

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

于 2008-08-27T08:29:56.780 回答
4

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

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

于 2008-08-27T14:47:40.787 回答