ApplicationScoped Bean或Singleton用于数据库表示?

时间:2012-10-23 14:45:44

标签: jsf java-ee singleton ejb

我有一个存储在数据库中的信息(实际上是一个内容存储库,但这应该无关紧要)应该呈现给所有用户。目前我有一个Singleton Bean,它获取此信息并将其存储在变量中。每次在数据库上发生更新时都会调用此提取操作,以便表示数据库内容的变量始终是最新的。此变量也由jsf托管bean用于显示信息。我想用这种方法避免的是必须为每个只读请求打开一个新的数据库连接。这种方法是否有意义,还是应该使用应用程序范围的托管bean?然后我必须从EJB中调用托管bean的更新方法。这样做有什么问题吗?

1 个答案:

答案 0 :(得分:3)

如果您希望在JSF中的给定Web应用程序的所有会话中保留信息,那么最好使用Application Scoped而不使用静态单例。

以下是几个原因:

  1. 静态字段基于特定VM中加载的类。如果您的应用程序要进行负载平衡或群集,那么其他应用程序服务器节点就不可能访问存储在其他服务器VM上的信息。

  2. ApplicationScoped bean可以序列化,这意味着某些Web和应用程序容器能够在服务器重新启动时将这些作用域bean保存到磁盘。这取决于给定服务器的功能。

  3. 某些应用程序服务器具有良好的群集支持以及粘性会话和全局cluser广泛的应用程序范围。如果当前会话服务器意外关闭,这将允许会话成功路由到另一台服务器。此外,ApplicationScoped bean将是公共的,并且可以在整个应用程序中随处访问,无论哪个节点正在为给定请求提供服务。同样,这在很大程度上取决于应用程序容器的功能和配置。

  4. 静态字段不仅可以被给定应用程序的VM上的每个请求访问,而且对于在给定VM上运行的每个应用程序的每个请求都可以使用。如果应用程序服务器或Web容器正在运行多个Web应用程序,并且它们都使用相同的类,则它们可能无意中共享信息或相互冲突。不是一个好的设计选择。

  5. 有关详细信息,请参阅以下内容:

    https://blogs.oracle.com/groundside/entry/application_scope_v_s_static