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?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top