すべてのユーザーに提示する必要のある情報をデータベース(実際にはコンテンツリポジトリですが、これは問題ではありません)に保存しています。現在、この情報をフェッチして変数に格納するシングルトンBeanがあります。このフェッチ操作は、データベースで更新が発生するたびに呼び出されるため、データベースのコンテンツを表す変数は常に最新です。また、この変数は、jsf管理対象Beanが情報を表示するために使用します。このアプローチで避けたかったのは、読み取り専用リクエストごとに新しいデータベース接続を開く必要があるということです。このアプローチは理にかなっていますか、それとも代わりにアプリケーションスコープのマネージドBeanを使用する必要がありますか?次に、EJB内からマネージドBeanのupdateメソッドを呼び出す必要があります。これを行うことに何か問題がありますか?
1 に答える
JSFで特定のWebアプリケーションのすべてのセッションにわたって情報を保持したい場合は、静的シングルトンを使用せずに、アプリケーションスコープを使用するのが最善です。
理由は次のとおりです。
静的フィールドは、特定のVMにロードされたクラスに基づいています。アプリケーションが負荷分散またはクラスター化されている場合、他のアプリケーションサーバーノードが別のサーバーVMに格納されている情報にアクセスできる可能性はありません。
ApplicationScoped Beanはシリアライズ可能です。つまり、特定のWebおよびアプリケーションコンテナーは、サーバーが再起動した場合に、これらのスコープ付きBeanをディスクに永続化することができます。ただし、これは特定のサーバーの機能によって異なります。
特定のアプリケーションサーバーは、優れたクラスタリングサポートに加えて、スティッキーセッションとグローバルなcluser全体のアプリケーションスコープを備えています。これにより、現在のセッションサーバーが予期せずダウンした場合に、セッションを別のサーバーに正常にルーティングできます。また、ApplicationScoped Beanはパブリックであり、特定のリクエストを処理しているノードに関係なく、アプリケーション全体のどこからでもアクセスできます。繰り返しますが、これはアプリケーションコンテナの機能と構成に大きく依存します。
静的フィールドは、特定のアプリケーションのVM上のすべてのリクエストにアクセスできるだけでなく、特定のVMで実行されているすべてのアプリケーションのすべてのリクエストにアクセスできます。アプリケーションサーバーまたはWebコンテナが複数のWebアプリケーションを実行していて、両方が同じクラスを使用している場合、誤って情報を共有したり、互いに衝突したりする可能性があります。良いデザインの選択ではありません。
詳細については、以下を参照してください。
https://blogs.oracle.com/groundside/entry/application_scope_v_s_static