已经引入了Singleton会话bean来解决什么问题?它是否仅用于共享所有bean的通用数据?
在此之前,如何在EJB 3.0和版本中管理该问题?
如果它保留了客户端特定的会话状态,那么该单个实例将拥有所有客户端(并试图同时访问)其中的特定数据?它会安全吗?
如果我们可以使用静态最终变量和静态初始化程序块或静态方法来初始化它们(因为静态变量也是每个类数据而不是每个实例数据) 在其他会话bean中,为了跨bean共享公共数据,单例会话bean的需求是什么?
在单身人士中使用商业方法是一个好的设计吗? 如果是这样,单个实例提供的客户端请求的响应时间将远远多于多个实例提供的响应时间。
此外,虽然singleton bean允许多个客户端并发访问单个bean实例, 默认的并发类型(容器托管)中的默认锁定类型(写入锁定)将阻止所有其他线程访问该bean,直到该方法结束,并且 这似乎是一个缺点吗?
如果有人能说清楚&简单的用例,其他bean不像单例bean那样完全适合
提前致谢:)
答案 0 :(得分:4)
是
通常,数据存储在静态变量中。由于包括单元测试在内的各种原因,静态变量并不是很好。另外,静态变量需要某种同步,严格阅读EJB规范并不允许这样做,尽管在实践中它工作正常。
通常,存储在单例中的状态不是特定于客户端的,而是特定于应用程序的。例如,缓存全局配置状态或从数据库缓存全局状态,可能使用定期非持久性计时器进行刷新。
没有,但请参阅#2。
不,单例bean可能不适合基于请求的业务逻辑。是的,默认情况下是使用WRITE锁的CONTAINER并发,因此一次只有一个线程。您应该根据需要使用@Lock(READ)
或@ConcurrencyManagement(BEAN)
。
如#3中所述,通常需要在所有bean之间共享“全局”应用程序状态。我发现单例会话bean对于应用程序配置和管理应用程序范围的计时器非常有用。