jsf - 数据库表示的 ApplicationScoped Bean 或 Singleton?

标签 jsf jakarta-ee singleton ejb

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

最佳答案

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

这里有几个原因:

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

  2. ApplicationScoped bean 可以序列化,这意味着某些 Web 和应用程序容器能够在服务器重启时将这些范围内的 bean 持久保存到磁盘。然而,这取决于您给定服务器的功能。

  3. 某些应用服务器具有良好的集群支持以及粘性 session 和全局集群范围的应用范围。如果当前 session 服务器意外关闭,这将允许 session 成功路由到另一台服务器。此外,ApplicationScoped bean 将在整个应用程序的任何地方都是公共(public)的和可访问的,而不管哪个节点正在为给定的请求提供服务。同样,这在很大程度上取决于应用程序容器的功能和配置。

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

更多信息见下文:

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

关于jsf - 数据库表示的 ApplicationScoped Bean 或 Singleton?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13033120/

相关文章:

java - JSF 支持 Bean 单元测试

java - Primefaces OutputLabel 通过参数填充方法

jakarta-ee - JMS 应用程序客户端可以创建多个事件 session 而 web/ejb 组件不能吗?

javascript - 什么是单例对象?

java - 这是内存泄漏吗?

ajax - ajax调用后复合组件渲染两次

java - 如何将两个值传递给 Java servlet?

java - 如何处理 Hibernate/Spring 应用程序中的后台线程

java - 向要存储在数据库中的字符串键(行键)添加前缀的推荐方法

java - 确保 "singleton-like"非final字段的唯一性,在哪里加锁?