单例会话 bean

Singleton session bean

  1. 引入Singleton session bean是为了解决什么问题??它只是为了共享所有bean 共有的数据吗??

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

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

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

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

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

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

提前致谢:)

  1. 是。

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

  3. 通常情况下,存储在单例中的状态不是特定于客户端的,而是特定于应用程序的。例如,缓存全局配置状态或从数据库缓存全局状态,也许使用周期性非持久性计时器刷新。

  4. 没有,但见#2。

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

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