リクエストスコープの Bean とデータモデルの初期化?
質問
更新 II:はい、少し絞り込むことができました。
ソート機能とフィルタリング機能を備えたデータテーブルを含むページがあり、どちらも DB 内で行われます。言い換えれば、私が使用する rich:datatable の組み込み機能は使用せず、DB に作業を行わせます。
私は〜と働く リクエストスコープの 豆。唯一のセッション スコープの Bean には、インターフェイスの並べ替えとフィルタリングが含まれています。
各列のフィルタリングは、特定のセッション Bean フィールドにバインドされます。そのため、実際にはモデル値の更新フェーズ中に更新されます。
並べ替えには私の側でロジックが必要だったので、特定のメソッドを呼び出してセッション Bean に正しい値を設定しました。これは、アプリケーションの起動フェーズ中に実行されます。
したがって、変更は、ページが実際にレンダリングされるレンダリング応答フェーズ中に適用されます。
問題は、ページ内の JSF データテーブルとデータスクローラーが backingBean.getDataModel()
DB からデータを取得し、 dataModel.getRowCount()
(別のクエリを実行するメソッドを呼び出すために実装しました) また 間に リクエスト値の適用 段階。これら 2 つのクエリは、変更がすべて完了する唯一のフェーズである応答レンダリング フェーズでも実行され、クエリは通常どおり実行されます。
これは、フィルタリングまたは並べ替えを実行した後にページを表示するには、2 倍のクエリが実行されることを意味します。
必要なクエリのみを実行し、それ以上は実行せずに並べ替えとフィルタリングを実行したいと考えています。
助言がありますか?
解決
要求値適用フェーズの間にゲッター呼び出しは必須です。ボタン/リンクは、それが呼び出しアクション・フェーズでコールにどの豆行動を知っているので、行のいずれかでクリック/押されたかを調べるためにも必須です。
しかし、あなたが検証/とvalueChange-チェックされる任意の入力フィールドや行のいずれかのいずれかのボタン/リンクを持っていない場合は、その後、私は要求値適用フェーズ時のクエリは完全にあなたの目であることを想像することができます余計ます。
残念ながら、あなたはそれを完全に無効にすることはできません。技術的には、それだけが唯一のBeanの間に呼び出されますように、専用Beanのコンストラクタにと豆のアクションメソッドでセッションスコープにデータBeanを入れていることに頼ると、高価なSQLクエリ(およびデータモデルのリフレッシュ)を行います(新しいソート/フィルター/何でもリクエスト中)(第一ビュー用)とBeanのアクションメソッドの間に建設。欠点は、データモデルの変更は、エンドユーザーが引き起こす可能性がある、同じセッションで開いているすべてのウィンドウ/タブに反映されていることがある「WTF?」エンドユーザーのための体験ます。
さて、トマホークは、(基本的には、要求固有のコンポーネントツリーのデータモデルを置くれ、preserveDataModel
用<t:dataTable>
属性の味で、このための素敵な回避策を持っていた最初だった今度は、既にセッションスコープに格納されていますかクライアント側の隠された入力フィールドに、)あなたは顔-configにビューステートの保存場所の構成方法に応じて。 RichFacesのは、そのような直接的な解決策はありませんが、<a4j:keepAlive>
は、基本的には同じこと。それは、あなたのデータBeanがよりだけデータモデルよりも含まれている場合ので、あなたはそれをリファクタリングする検討するかもしれない、「全体」豆に影響を与えます。あなたはそれがセッションスコープのBeanであるかのようにBeanを設計するために心に留めておく必要があります。
データモデルが大きくなる場合は、私は、この影響を与えるサーバのメモリと想像することができますが、専用メモリにデータモデルのの閲覧の部分を格納した場合、これは本当に多くを傷つけるべきではない(と他のすべてのページを含むので、ないの全体のデータモデル、)。それは、単一のHTTPリクエストの間に二重のSQLクエリを発射するコストを上回るかどうかを確認してください。
希望このことができます。