4 votes

Quel est le meilleur moyen de paginer un grand Resultset - Java

Je cherche la meilleure approche du point de vue des performances pour afficher partiellement le jeu de résultats sur une page Web, disons par 10 éléments par page et si l'utilisateur veut voir plus de résultats, il appuie sur le bouton "suivant". Je pense (probablement à tort) qu'il devrait s'agir d'une nouvelle demande au serveur lorsque le bouton "Suivant" est pressé ??

Actuellement, j'essaie d'apprendre Java, GWT

Merci!

PS : désolé pour mon anglais.

4voto

kdgregory Points 21849

La réponse dépendrait du comportement de vos utilisateurs : à quelle fréquence regarderont-ils la page 2, ou la page 10, ou la page 100.

S'ils regardent rarement la page 2, et ne regardent jamais la page 10 ou la page 100, alors soumettre à nouveau la requête peut être acceptable.

S'ils regardent habituellement la page 2, regardent souvent la page 10, et regardent occasionnellement la page 100, alors un cache partiel sera utile : mettez en cache les 100 premiers (ou 200, ou 300) résultats, et soumettez à nouveau la requête uniquement lorsqu'ils dépassent ces résultats. Je stockerais probablement le cache dans la session de l'utilisateur, bien que vous deviez réfléchir à cela si votre serveur d'application est en cluster.

Et s'ils parcourent toujours chaque résultat ? Les caches partiels restent la réponse, car vous ne voulez pas stocker de gros morceaux de données en mémoire.

1voto

Carl Smotricz Points 36400

Étant donné que vous avez "GWT" dans vos balises, je suppose que votre application serveur fonctionne sur Google App Engine (GAE).

  • Une approche consiste à obtenir tous les résultats de votre première requête, les stocker dans une base de données, afficher les 20 premiers et permettre aux liens suivant/précédent de récupérer des sous-ensembles des données stockées dans la base de données. N'oubliez pas de supprimer ces résultats de la base de données lorsque la session de l'utilisateur expire!

  • Une autre approche consiste à obtenir tous les résultats à chaque affichage de page, mais à les parcourir jusqu'à ce que vous atteigniez le sous-ensemble souhaité de 20, et à n'afficher que ceux-ci.

Je pense qu'avec GAE en dessous, la 2ème approche fonctionnera mieux, sauf si votre requête risque de renvoyer plus de 1000 résultats, ce que GAE ne vous permettra pas de récupérer en une seule transaction.

  • La meilleure approche, si vos données et clés s'y prêtent, serait de sortir les 20 éléments de données corrects dès la phase de requête. Mais à moins que vos données ne soient des clés entières ascendant en continu, cela pourrait être difficile à réaliser

0voto

extraneon Points 13362

Vous obtenez généralement seulement une "page" de la base de données.

Disons qu'une requête

select * from mytable where column1="a";

retournerait 1000 enregistrements. Obtenir une page ressemblerait alors à ceci (mysql) :

select * from mytable where column1="a" limit 0, 10;

pour la page 1 (0 à 10), et la page 2 serait récupérée comme suit :

select * from mytable where column1="a" limit 10, 20;

et ainsi de suite. Si les données sont importantes (1000 enregistrements), mais pas énormes (1000 000 enregistrements), vous pouvez également donner l'ensemble des données en une seule fois et utiliser javascript pour paginer. Cela a l'avantage supplémentaire que le tri peut être effectué côté client.

0voto

dogbane Points 85749

Si vous ne pouvez pas utiliser une approche basée sur le cache en raison des limitations de mémoire, utilisez une approche basée sur les requêtes. Ajustez la clause WHERE de votre requête de recherche pour sélectionner explicitement les données en fonction de la page demandée par l'utilisateur. Cette approche nécessite que vous transmettiez des informations de contexte supplémentaires lors de vos demandes de page.

Une approche consiste à récupérer des pages en utilisant des identifiants de ligne logiques (ou clés primaires) qui délimitent la page et identifient chaque ligne dans l'ensemble de résultats.

Disons que vous avez une table très simple avec une séquence numérique d'identifiants de ligne. Si vous affichez 100 lignes par page et que l'utilisateur a demandé la page deux, vous ajusteriez la clause WHERE comme suit :

select col, col2 from my_table where
row_id > 100
and row_id <= 200
order by rownum asc

0voto

tiantian Points 8

Vous pouvez mettre en cache/récupérer les enregistrements dans la couche web, la couche backend (par exemple ejb) ou la couche de base de données (comme dernière instruction "limit" ou row_id). l'approche à utiliser dépend de vos besoins (comme l'a dit kdgregory).

la plus populaire est de les mettre en cache dans la couche web en utilisant la session.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X