Jsf 数据库表示的应用程序范围Bean还是单例?
我将信息存储在一个数据库中(实际上是一个内容存储库,但这不重要),它应该呈现给所有用户。目前我有一个单例Bean,它获取这些信息并将其存储在一个变量中。每次更新数据库时都会调用此获取操作,以便表示数据库内容的变量始终是最新的。jsf托管bean也使用这个变量来显示信息。我希望通过这种方法避免的是,必须为每个只读请求打开一个新的数据库连接。这种方法有意义吗?还是应该改用应用程序范围的托管bean?然后,我必须从EJB中调用托管bean的update方法。这样做有什么不对吗?如果您希望在JSF中跨给定web应用程序的所有会话持久化信息,那么最好使用应用程序范围,而不是使用静态单例 以下是一些原因:Jsf 数据库表示的应用程序范围Bean还是单例?,jsf,jakarta-ee,singleton,ejb,Jsf,Jakarta Ee,Singleton,Ejb,我将信息存储在一个数据库中(实际上是一个内容存储库,但这不重要),它应该呈现给所有用户。目前我有一个单例Bean,它获取这些信息并将其存储在一个变量中。每次更新数据库时都会调用此获取操作,以便表示数据库内容的变量始终是最新的。jsf托管bean也使用这个变量来显示信息。我希望通过这种方法避免的是,必须为每个只读请求打开一个新的数据库连接。这种方法有意义吗?还是应该改用应用程序范围的托管bean?然后,我必须从EJB中调用托管bean的update方法。这样做有什么不对吗?如果您希望在JSF中跨给
这个问题的表达方式暗示您正在使用普通的JDBC,而不是JPA+JTA+connectionpool。这是真的吗?好吧,看来内容存储库毕竟还是有意思的。我使用jcr api作为资源适配器,使用jackrabbit作为实现,用于接收信息谢谢您的输入。在我的情况下,我不想在所有会话中持久化数据。我只想在所有请求中显示相同的数据。因此,我正在寻找最好的方式向每个用户显示数据库内容,而无需为每个用户打开直接的数据库连接…@user1644061但原理相同。。。您将为所有请求持久化一个应用程序范围的bean,而这个bean恰好有一个对数据源连接的引用。不过,仅仅拥有一个连接本身是不安全的,如果发生了什么事情,并且当前连接最终关闭,那么最好是引用一个连接工厂,该工厂将为您创建一个新连接。好的,非常感谢,我将使用一个应用程序范围的bean。根据您的回答,我想从EJB中调用bean没有什么错吧?而且:由于应用程序范围的bean只实例化一次,所以在其中包含方法是否有问题?例如,一个允许用户在saveas对话框中下载文件的方法?@user1644061我认为ApplicationScoped bean在被注入另一个bean的新创建的托管属性时被实例化,并且只有当它还不存在时才被实例化。除非您使用单独的DI容器,如CDI或Spring,否则它还需要可序列化,因为它本质上是在内存或临时磁盘空间中的ApplicationsServletContext中序列化applicationscoped bean。只要服务器在运行,或者应用程序未部署,或者从ServletContext手动删除或销毁,它就会一直存在。