displaytag大きなリストを休止
-
20-09-2019 - |
質問
私は自分のDBからのデータを持つテーブルを構築するためにdisplaytagを使用しています。これは、要求されたリストには、その大きなない場合はうまく動作しますが、リストのサイズが2500のエントリの上に成長した場合、結果のリストを取得することは非常に時間がかかる(5分以上)。この動作が正常であれば、私は思っていました。
あなたが大きな結果を返す大きなリスト/クエリを処理する方法?
解決
、あなたもあなたのクエリを実行し、問題を持つことができます。私はあなたがこれを除外していると仮定します。そうでない場合は、先に述べたようにSQLを持っている - 私は任意のDBのボトルネックがあるかどうかを確認するためにDB2のクエリアナライザを通してそれを実行します。チェーンまで次のステップは、ミックスでdisplaytagせずにユニットテスト中にHibernate / DAO呼び出しのテストを実行することです。あなたはすでにこれをやったように、再び、あなたは物事を言葉で表現しまし方法から、それが鳴ります。
他のヒント
メモリー(セッション)でDisplaytagの曳して保存すべて。 Hibernateはまた、それを行います。あなたは、減速はすでに2500行で始まる場合は、それがよりひどく最適化されたSQLクエリ/ DBテーブルの問題のように見える(メモリに一度に全体のDBテーブルの内容を持っている必要はありません; 2500行がためにピーナッツでなければなりませんまともなDB、しかし)OK、それはまた別の話だ。
むしろ JSTLの少しの助けを借りてHTMLテーブルを自分で作成の c:forEach
と EL でのショット。 input type="hidden"
背景1つのまたは2つのリクエストパラメータを保つ:最初の行(firstrow
)が表示されるように、最終的に行の量を一度に表示する(rowcount
)
次に、あなたのDAOクラスでちょうどSELECT stuff FROM data LIMIT firstrow OFFSET rowcount
または使用DBに応じて、そのような何かを行います。 MySQLとPostgreSQLでは、あなたはそのようなLIMIT
および/またはOFFSET
句を使用することができます。オラクルでは、サブクエリを発射する必要があります。 MSSQLおよびDB2では、SPを作成する必要があります。あなたはHQLでそれを行うことができます。
次に、テーブルを通じてページに、ちょうど/ firstrow
毎回でrowcount
をデクリメント中に、サーバー側のコードを指示バンチボタンがあります。ただ、数学を行います。
編集:あなたがDB2を使用しているとコメントしました。私は少しの研究を行ってきた、あなたがこのためにUDB OLAP機能ROW_NUMBER()
を使用することができます表示されます。
SELECT id, colA, colB, colC
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY id) AS row, id, colA, colB, colC
FROM
data
) AS temp_data
WHERE
row BETWEEN 1 AND 10;
この例ではdata
テーブルから第10行を返すべきです。あなたはすべてのページのためにそれを再利用できるように、このクエリをパラメータ化することができます。これは、Javaのメモリにテーブル全体を照会するよりも効率的です。また、テーブルが適切にインデックス化されていることを確認します。