2009-04-21 3 views
-1

J'utilise le framework Struts 2 mais cette question n'est pas seulement liée à Struts 2. J'essaye d'avoir une sorte de pagination dans mon site Web. Disons que j'ai une liste d'enregistrements que je veux montrer sur une page. La liste a 150 enregistrements mais je veux montrer 50 sur chaque page, dans ce cas il y aura 3 pages. Bien sûr, la liste sera extraite de la base de données.Pagination avec une torsion

La torsion est que nous avons une restriction où si une requête prend plus de 7 secondes, il obtient tué (ne demandez pas). Donc, si nous obtenons 150 enregistrements en même temps, notre requête prend plus de 7 secondes. Nous avons donc décidé d'obtenir 50 enregistrements à chaque fois. Donc, dans ce cas, nous irons à la DB 3 fois (50 50 50). La première fois que nous allons chercher le total (150), nous savons combien de fois devrions-nous retourner à la DB. Est-ce que certains d'entre vous peuvent partager votre avis sur la façon dont vous pourriez gérer quelque chose comme ça? Je sais que certains d'entre vous pourraient dire que peaufiner la procédure stockée ou la requête est le meilleur pari, mais ce sera une route douloureuse à prendre car nous avons beaucoup de SP et de requêtes.

J'apprécierais tous les exemples.

Répondre

0

Êtes-vous simplement à la recherche de conseils généraux sur la façon de gérer la radiomessagerie? Vous êtes sur la bonne voie en pensant que vous ne devriez saisir que les enregistrements dont vous avez besoin dans la base de données pour limiter les requêtes.

Différents SGBDR ont des approches différentes pour l'énumération et les enregistrements de pagination. MySQL a le mot-clé LIMIT pour cela, MS SQL Server 2005 et plus ont la fonction ROW_NUMBER(), et Oracle a une colonne spéciale ROWNUM. Selon votre SGBDR, il devrait être facile de trouver des exemples d'utilisation de ces fonctionnalités.

1

Vous n'avez pas besoin d'effectuer une extraction réelle la première fois, vous pouvez récupérer le nombre uniquement (requête de fonction d'agrégation). Une liste paginée en direct est commune spécialement dans les très grands ensembles de données, le seul problème serait qu'il n'y a aucune garantie de l'état de la page. c'est-à-dire que des enregistrements peuvent être insérés dans un ordre dans une page précédente, poussant ainsi un enregistrement plus ancien dans votre nouvelle page, et vice versa. C'est généralement acceptable d'avoir cela.

0

Une requête par exemple pour ce que vous pagination obtenez seulement nombre limité d'enregistrements est: -

select * from records limit $start,50 

Ici je suppose que votre requête initiale était select * à partir des dossiers. Ajoutez simplement votre requête d'origine avec "limit $ start, 50". Ici, quand vous voulez que les 50 premiers enregistrements commencent, ils doivent être égaux à 0, aller chercher 50-100 enregistrements, commencer à être égal à 50 et 100-150 enregistrements commencer à être égal à 100. En ajoutant "limit $ start, 50" à requête, la requête prend 50 enregistrements à partir du numéro d'enregistrement $ start. J'espère que cela résoudra votre problème de pagination.