Le Displaytag déplace et stocke tout dans la mémoire (la session). Hibernate le fait aussi. Vous ne voulez pas avoir tout le contenu de la table de base de données à la fois en mémoire (cependant, si le ralentissement commence déjà à 2500 lignes, cela ressemble plus à une requête SQL/table DB mal optimisée, 2500 lignes doivent être des arachides DB décent, mais OK, c'est une autre histoire). Créez plutôt vous-même une table HTML avec l'aide de JSTLc:forEach
et une prise de EL. Gardez un ou deux paramètres de requête en arrière-plan dans input type="hidden"
: la première ligne à afficher (firstrow
) et éventuellement la quantité de lignes à afficher en une fois (rowcount
).
Ensuite, dans votre classe DAO, faites simplement SELECT stuff FROM data LIMIT firstrow OFFSET rowcount
ou quelque chose comme ça en fonction du DB utilisé. En MySQL et PostgreSQL, vous pouvez utiliser la clause LIMIT
et/ou OFFSET
comme ça. Dans Oracle, vous devez déclencher une sous-requête. Dans MSSQL et DB2, vous devrez créer un SP. Vous pouvez le faire avec HQL. Ensuite, pour feuilleter la table, il suffit d'avoir un ensemble de boutons qui indique au code côté serveur d'entrer/décrémenter le firstrow
avec rowcount
à chaque fois. Fais juste le calcul.
Modifier: vous avez indiqué que vous utilisiez 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 de pouvoir la réutiliser pour chaque page. C'est plus efficace que d'interroger toute la table dans la mémoire de Java. Assurez-vous également que la table est correctement indexée.
ce n'est pas normal. donne plus de détails sur votre configuration, configuration, contexte réseau, etc. – Bozho
J'interroge une base de données DB2 avec une grande quantité de données. La configuration sont des portlets JSR-168 qui utilisent Spring 2.5.6 pour mes DAO. La requête est très complexe et comprend quelques exceptions et IN (Selects ..) Serveur et Db sont sur la même machine – onigunn
Comment la requête s'exécute dans un client SQL? –