1
  1. 引入了 Singleton session bean 来解决什么问题??是否仅用于共享所有 bean 共有的数据?

  2. 在 EJB 3.0 和之前的版本中如何管理这个问题?

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

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

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

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

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

提前致谢 :)

4

1 回答 1

4
  1. 是的。

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

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

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

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

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

于 2015-05-13T04:21:58.100 回答