【问题标题】:Singleton session bean单例会话 bean
【发布时间】:2015-07-23 02:09:54
【问题描述】:
  1. 引入了单例会话 bean 来解决什么问题?难道只是为了共享所有豆子共有的数据吗??

  2. 在 EJB 3.0 及之前的版本中如何管理该问题?

  3. 如果它保留客户端特定的会话状态,则该单个实例将包含所有客户端(尝试同时访问)的特定数据?它会安全吗??

  4. 如果我们可以使用静态最终变量和静态初始化块或静态方法来初始化它们(因为静态变量也是每个类数据而不是每个实例数据) 在其他会话 bean 中,为了在 bean 之间共享公共数据,单例会话 bean 需要什么?

  5. 在单例中有业务方法是一个好的设计吗? 如果是这样,单个实例服务的客户端请求的响应时间将远远超过多个实例服务的响应时间。

    此外,虽然单例 bean 允许多个客户端同时访问单个 bean 实例, 默认并发类型(容器管理)中的默认锁类型(写锁)将阻止所有其他线程访问 bean,直到该方法结束,并且 这似乎是一个缺点吧??

  6. 如果有人能给出一个清晰简单的用例,其中没有其他 bean 能像单例 bean 那样完全适合,那将非常有帮助

在此先感谢 :)

【问题讨论】:

  • 每个问题问一个问题。
  • @BalusC 很抱歉将所有内容合二为一。我理解你的观点。但这些都是相关的,我想对单例 bean 有一个全面的了解。这就是我在一篇文章中发布所有内容的原因。 .

标签: jakarta-ee singleton ejb ejb-3.1 session-bean


【解决方案1】:
  1. 是的。

  2. 通常数据存储在静态变量中。由于包括单元测试在内的多种原因,静态变量并不是很好。此外,静态变量需要某种同步,严格阅读 EJB 规范不允许这样做,但实际上它工作得很好。

  3. 通常,存储在单例中的状态不是特定于客户端的,而是特定于应用程序的。例如,缓存全局配置状态或缓存来自数据库的全局状态,可能会使用周期性的非持久性计时器进行刷新。

  4. 没有,但请参阅 #2。

  5. 不,单例 bean 可能不适合基于请求的业务逻辑。是的,默认是带有 WRITE 锁的 CONTAINER 并发,所以一次只有一个线程。您应该根据需要使用@Lock(READ)@ConcurrencyManagement(BEAN)

  6. 如 #3 中所述,通常需要在所有 bean 之间共享的“全局”应用程序状态。我发现单例会话 bean 对于应用程序配置和管理应用程序范围的计时器很有用。

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 2016-01-02
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多