3

すべてのユーザーに提示する必要のある情報をデータベース(実際にはコンテンツリポジトリですが、これは問題ではありません)に保存しています。現在、この情報をフェッチして変数に格納するシングルトンBeanがあります。このフェッチ操作は、データベースで更新が発生するたびに呼び出されるため、データベースのコンテンツを表す変数は常に最新です。また、この変数は、jsf管理対象Beanが情報を表示するために使用します。このアプローチで避けたかったのは、読み取り専用リクエストごとに新しいデータベース接続を開く必要があるということです。このアプローチは理にかなっていますか、それとも代わりにアプリケーションスコープのマネージドBeanを使用する必要がありますか?次に、EJB内からマネージドBeanのupdateメソッドを呼び出す必要があります。これを行うことに何か問題がありますか?

4

1 に答える 1

3

JSFで特定のWebアプリケーションのすべてのセッションにわたって情報を保持したい場合は、静的シングルトンを使用せずに、アプリケーションスコープを使用するのが最善です。

理由は次のとおりです。

  1. 静的フィールドは、特定のVMにロードされたクラスに基づいています。アプリケーションが負荷分散またはクラスター化されている場合、他のアプリケーションサーバーノードが別のサーバーVMに格納されている情報にアクセスできる可能性はありません。

  2. ApplicationScoped Beanはシリアライズ可能です。つまり、特定のWebおよびアプリケーションコンテナーは、サーバーが再起動した場合に、これらのスコープ付きBeanをディスクに永続化することができます。ただし、これは特定のサーバーの機能によって異なります。

  3. 特定のアプリケーションサーバーは、優れたクラスタリングサポートに加えて、スティッキーセッションとグローバルなcluser全体のアプリケーションスコープを備えています。これにより、現在のセッションサーバーが予期せずダウンした場合に、セッションを別のサーバーに正常にルーティングできます。また、ApplicationScoped Beanはパブリックであり、特定のリクエストを処理しているノードに関係なく、アプリケーション全体のどこからでもアクセスできます。繰り返しますが、これはアプリケーションコンテナの機能と構成に大きく依存します。

  4. 静的フィールドは、特定のアプリケーションのVM上のすべてのリクエストにアクセスできるだけでなく、特定のVMで実行されているすべてのアプリケーションのすべてのリクエストにアクセスできます。アプリケーションサーバーまたはWebコンテナが複数のWebアプリケーションを実行していて、両方が同じクラスを使用している場合、誤って情報を共有したり、互いに衝突したりする可能性があります。良いデザインの選択ではありません。

詳細については、以下を参照してください。

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

于 2012-10-23T15:44:39.540 に答える