Mise en veille prolongée displaytag grandes listes
-
20-09-2019 - |
Question
J'utilise displaytag pour construire des tables avec des données de mon db. Cela fonctionne bien si la liste est pas grand, mais si la taille de la liste se développe plus de 2500 entrées, aller chercher la liste des résultats prend beaucoup de temps (plus de 5 min.). Je me demandais si ce comportement est normal.
Comment gérez-vous la liste / requêtes grandes qui reviennent de grands résultats?
La solution
Si vous travaillez avec une grande base de données, vous pourriez aussi avoir un problème d'exécuter votre requête. Je suppose que vous avez décidé cela. Sinon, vous avez le SQL comme mentionné plus haut - je courrais à travers l'analyseur de requêtes DB2 pour voir s'il y a des goulots d'étranglement DB. La prochaine étape de la chaîne est d'exécuter un test de l'appel Hibernate / DAO dans un test unitaire sans displaytag dans le mélange. Encore une fois, de la façon dont vous avez LIBELLEES les choses, il semble que vous avez déjà fait.
Autres conseils
chalutages displaytag et stocke tout dans la mémoire (la session). Hibernate également. Vous ne voulez pas avoir l'intégralité du contenu de la table DB à la fois dans la mémoire (toutefois, si le ralentissement commence déjà à 2500 lignes, plus ressembler à une question de mal optimisé table de requête SQL / DB, 2500 lignes doivent être arachides pour un DB décent, mais OK, c'est une autre histoire).
créer plutôt vous-même table HTML avec peu d'aide de JSTL c:forEach
un coup de EL . Garder un ou deux paramètres demande en arrière-plan dans input type="hidden"
:. La première ligne à afficher (firstrow
) et, éventuellement, le nombre de lignes à afficher à la fois (rowcount
)
Ensuite, dans votre classe DAO font juste un SELECT stuff FROM data LIMIT firstrow OFFSET rowcount
ou quelque chose comme ça en fonction du DB utilisé. MySQL et PostgreSQL, vous pouvez utiliser le LIMIT
et / ou clause de OFFSET
comme ça. Dans Oracle, vous aurez besoin de tirer une sous-requête. Dans MSSQL et DB2 vous devrez créer un SP. Vous pouvez le faire avec HQL.
Ensuite, à la page à travers la table, ont juste un des boutons de botte qui indique le code côté serveur dans / décrémenter le firstrow
avec chaque fois de rowcount
. Il suffit de faire le calcul.
Modifier : vous avez dit que vous utilisez DB2. Je l'ai fait un peu de recherche et il semble que vous pouvez utiliser la fonction OLAP UDB ROW_NUMBER()
pour cela:
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;
Cet exemple doit retourner les 10 premières lignes de la table data
. Vous pouvez paramétrer cette requête afin que vous puissiez le réutiliser pour chaque page. Ceci est plus efficace que l'interrogation de la table entière dans la mémoire de Java. Assurez-vous également que la table est correctement indexé.