Afficher ds une JSP le résultat d'une requête par paquets de n lignes

Afficher ds une JSP le résultat d'une requête par paquets de n lignes - Java - Programmation

Marsh Posté le 06-08-2002 à 11:27:36    

Tout est dans le titre : comme ce qui est fait sur n'importe quel site de vente en ligne, je souhaiterais afficher sur une JSP le résultat d'une grosse requête (plusieurs centaines de lignes par exemple) par paquets : par exemple 20 lignes par page, puis on doit cliquer sur "suivant" pour avoir les 20 suivantes,etc.
Je me demande par où commencer : est ce que la solution se situe dans la requête SQL, dans l'exploitation du ResultSet ? A priori, une solution en faisant un select sur la clé primaire (par exemple WHERE cle>valeur AND cle<=valeur+n) ne m'irait pas car je souhaiterais trier mes enregistrements.
 
J'utilise JDBC avec une base Access (meme si c'est pas possible sur une base comme ca, ca m'intéresserait de savoir comment on fait sur un SGBD qui va bien).
 
Merci...

Reply

Marsh Posté le 06-08-2002 à 11:27:36   

Reply

Marsh Posté le 06-08-2002 à 11:54:43    

c'est assez simple.
 
Ta requete prendre un nombre maximum de resultats a prendre et l'index ou il faut démarrer.
 
 


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 06-08-2002 à 13:19:02    

Bah, a mon avis, garder le ResultSet ouvert, pkoi pas, mais tu es obligé de garder le Statement ouvert aussi, donc, la connection avec....Pas top top....
Après, tu peux choisir de faire une requête qui te renvoie les éléments du i° au j°...mais tu auras une requête par action sur le bouton "suivant" ou "précédent"
La troisième solution consiste à sauvegarder la totalité de tes résultats dans un objet, qui permet de récupérer les éléments qui t'intéressent...
Après, le choix de la solution dépend de plein de choses : 'poids' des requêtes, etc, etc..

Reply

Marsh Posté le 06-08-2002 à 14:05:44    

le truc c'est garder 100 000 résultats si tu regargede seuelemnt les 50 premier en moyenne c'est pas super efficient ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 06-08-2002 à 14:10:46    

Merci pour vos réponses.

Citation :


c'est assez simple.  
 
Ta requete prendre un nombre maximum de resultats a prendre et l'index ou il faut démarrer.  


Justement, c'est ça que je ne sais pas faire  :D  tu pourrais détailler un peu ?
 

Citation :


Bah, a mon avis, garder le ResultSet ouvert, pkoi pas, mais tu es obligé de garder le Statement ouvert aussi, donc, la connection avec....Pas top top....  


Ca ne me choque pas trop a priori. C'est de toute facon moins couteux que de redemander une connexion à chaque fois.
 

Citation :


Après, tu peux choisir de faire une requête qui te renvoie les éléments du i° au j°...mais tu auras une requête par action sur le bouton "suivant" ou "précédent"  


En mémorisant où j'en suis dans la session je pourrai m'en sortir avec une seule requete.
 

Citation :


La troisième solution consiste à sauvegarder la totalité de tes résultats dans un objet, qui permet de récupérer les éléments qui t'intéressent...  


Ca, je ne peux définitivement pas le faire : le nombre d'objets sauvegardés en mémoire est trop important (plusieurs centaines voire plusieurs milliers d'enregistrements).
 

Citation :


Après, le choix de la solution dépend de plein de choses : 'poids' des requêtes, etc, etc..


En fait je bosse sur un modèle générique d'architecture et je développe un petit exemple pas très significatif.En tout cas ce que je fais doit supporter des requetes retournant des résultats très importants (en nombre de lignes et de champs).

Reply

Marsh Posté le 06-08-2002 à 15:12:20    

En SQL, t'as rien pour dire que tu veux les résultats de n à m.
Par contre, les gros SGBD pallient à ce manque du SQL.
Genre, avec SQL Server, tu peux faire

SELECT TOP 50 * FROM MATABLE

(salut les p'tits clous :D) qui te sélectionnera les 50 premiers enregistrements (avec ça, tu peux te démerder pour faire une sélection des enregistrements du 50° au 100° avec des requètes imbriquées et un classement, j'développerai si tu veux !)
acec Oracle, j'crois que t'as une contrainte MAWROW ou ROWMAX:

SELECT * FROM MATABLE WHERE ROWMAX=50;


 
Sinon, pour ta mise en page, regarde un peu ça :
http://jsptags.com/tags/navigation/pager/

Reply

Marsh Posté le 06-08-2002 à 15:27:53    

Citation :


Ca ne me choque pas trop a priori. C'est de toute facon moins couteux que de redemander une connexion à chaque fois.


 
Faux!! Si tu as 25 péquins qui font la requête en même temps, et qui bloquent chacun une connection, qui a l'air d'un con???
 
 

Citation :


En mémorisant où j'en suis dans la session je pourrai m'en sortir avec une seule requete.
 
la troisième solution consiste à sauvegarder la totalité de tes résultats dans un objet, qui permet de récupérer les éléments qui t'intéressent...  
Ca, je ne peux définitivement pas le faire : le nombre d'objets sauvegardés en mémoire est trop important (plusieurs centaines voire plusieurs milliers d'enregistrements).


 
Bah, c'est un peu la même chose...
Ou sinon, tu te fais une API de recherche, qui gère un cache de résultats, tu sera moins emmerdé..

Reply

Marsh Posté le 06-08-2002 à 15:30:42    

Merci Gringo.
 :lol: pour les p'tits clous (ah la la, Marc Toesca, que de souvenirs)
 
Je viens d'essayer le coup du TOP dans Access, ca marche. Par contre pourrais tu développer ton histoire de "requetes imbriquées et de classement" STP ?

Reply

Marsh Posté le 06-08-2002 à 15:37:01    

GFive:
Que stockerais tu dans le cache ? une liste d'identifiants par exemple ? Parce que je ne peux pas me permettre de stocker des milliers objets en mémoire...
 
Autre chose : quand tu parles d' "une requête qui te renvoie les éléments du i° au j°", sais tu comment je pourrais le réaliser ?
Pour l'instant, j'arrive à faire ca du 1er au 50e enregistrement, mais apres...
 
J'en profite pour remercier tout le monde de m'aider.C'est la première fois que je poste une question et c'est vraiment sympa que des gens me répondent   :jap:

Reply

Marsh Posté le 06-08-2002 à 15:41:46    

swgreedo a écrit a écrit :

Merci Gringo.
 :lol: pour les p'tits clous (ah la la, Marc Toesca, que de souvenirs)
 
Je viens d'essayer le coup du TOP dans Access, ca marche. Par contre pourrais tu développer ton histoire de "requetes imbriquées et de classement" STP ?




 
Ouais, j'voulais pas développer pr rien, ms si ça t'interresse, c parti :
en fait, tu vas faire un truc du genre ça :
Rouge ---------------------------------------------->
Vert   -------------------------->
Bleu                     <------------
(merde, j'arrive mêmep as à metttre des couleurs ! :D)
 
Où on a, en rouge l'ensemble des enregistrements de ton select, en vert, la restriction par le 1er top, et en rouge les résultats que tu récupères à la fin.  
 
En rouge, c la requète :

SELECT * FROM MATABLE


 
En vert :

SELECT TOP 50 * FROM MATABLE ORDER BY UNCHAMP ASC

("UNCHAMP"  peut être ta clé primaire ou autre chose. c bien si ce champ a une valeur différente pr chaque enregistrement)
 
En bleu :

SELECT TOP 25 * FROM (SELECT TOP 50 * FROM MATABLE ORDER BY UNCHAMP ASC) ORDER BY UNCHAMP DSC

(UNCHAMP est 2 fois le même champ bien sur !)
 
J'ai pas testé, mais en gros, ça doit être un truc comme ça.


Message édité par El_gringo le 06-08-2002 à 15:47:40
Reply

Marsh Posté le 06-08-2002 à 15:41:46   

Reply

Marsh Posté le 06-08-2002 à 15:54:57    

Merci  :jap:  
Je vais tester ca...

Reply

Marsh Posté le 07-08-2002 à 15:56:31    

Tu peux aussi utiliser le ROWNUM ("select * from (select * from matable) where ROWNUM between 1 and 10", par exemple) dans ta requete SQL et faire un ptit dev JSP pour spécifier eventuellement le nombre d'enregistrements max, et définir le nombre de pages, etc ...
 
Edit : attention, à moins de passer par des vues, le ORDER BY sur un champ ne fonctionnera plus, le ORDER BY se fera systématiquement par le ROWNUM


Message édité par wlitw le 07-08-2002 à 15:58:35

---------------
Steam : wlitw77 - GoG : wlitw
Reply

Marsh Posté le 07-08-2002 à 15:59:09    

El_Gringo a écrit a écrit :

 
 

SELECT TOP 25 * FROM (SELECT TOP 50 * FROM MATABLE ORDER BY UNCHAMP ASC) ORDER BY UNCHAMP DSC





el_gringo tu me déçois là
les requetes imbriquées spabieng  :non:  
c'est pas darklord qui va me contredire :D

Reply

Marsh Posté le 07-08-2002 à 16:11:33    

--greg-- a écrit a écrit :

 
el_gringo tu me déçois là
les requetes imbriquées spabieng  :non:  
c'est pas darklord qui va me contredire :D




 
...J'te déçois !?
Ouah, ça veut dire qu'un instant j'étais monté dans ton estime ? :D
 
Trève de conneries, t'as mieux comme solution pour SQL Server ?
Et, à part que c pas bien, tu reproches quoi aux requètes imbriquées ?
Parce que, niveau perfs, si tu veux une centaine d'enregistrements sur une base qui en a qqs millions, j'peux te dire que t gagnant, ms alors qqch de terrible !

Reply

Marsh Posté le 07-08-2002 à 16:23:46    

Moi betement, j'aurais fait un bean contenant l'ensemble des resultats, attaché à la session, et dans lequel je vais piocher selon le numero de la page demandée...
Mais c'est sur que ca fait sortir et conserver tous les resultats pour n'en afficher que quelques-uns

Reply

Marsh Posté le 07-08-2002 à 16:24:14    

ben je ne sais pas coment le truc là, TOP fonctionne mais bon.
admetton que tu as un champ ID dans ta table.
meme s'il nest pas "continu", tant que tu sais l'id a partir duquel tu veux afficher, c bon
 
tu fais ça

select top 20 * from tatable where id>X

en remplaçant X par l'id du dernier enregistrement affiché.
tout betement.

Reply

Marsh Posté le 07-08-2002 à 16:25:07    

R3g a écrit a écrit :

Moi betement, j'aurais fait un bean contenant l'ensemble des resultats, attaché à la session, et dans lequel je vais piocher selon le numero de la page demandée...
Mais c'est sur que ca fait sortir et conserver tous les resultats pour n'en afficher que quelques-uns



jte dis pas la tronche de ton servuer avec 100 users et 10000 records dans ta table.
swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap

Reply

Marsh Posté le 07-08-2002 à 16:31:29    

--greg-- a écrit a écrit :

jte dis pas la tronche de ton servuer avec 100 users et 10000 records dans ta table.
swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap  




En fait c'est ca mon probleme : ca fait deux mois que je fais des applis cote serveur, et j'ai jamais travaillé que sur un serveur de test ou je suis le seul user. Mais je me doutais quand meme que c'était pas la bonne solution hein..

Reply

Marsh Posté le 07-08-2002 à 16:36:46    

[:rofl]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-08-2002 à 17:06:44    

DarkLord a écrit a écrit :

 [:rofl]  




Ben koi, t'as jamais débuté ?

Reply

Marsh Posté le 07-08-2002 à 17:09:37    

--greg-- a écrit a écrit :

ben je ne sais pas coment le truc là, TOP fonctionne mais bon.
admetton que tu as un champ ID dans ta table.
meme s'il nest pas "continu", tant que tu sais l'id a partir duquel tu veux afficher, c bon
 
tu fais ça

select top 20 * from tatable where id>X

en remplaçant X par l'id du dernier enregistrement affiché.
tout betement.
 




 
Bah ouais, ms bon, 'faut admettre que t'as un champ ID !!!
Souvent on choisis pas soit même la structure de la base de données sur laquelle notre appli diot bosser (c mon cas, et je pense pas être le seul !)

Reply

Marsh Posté le 07-08-2002 à 17:11:00    

R3g a écrit a écrit :

Moi betement, j'aurais fait un bean contenant l'ensemble des resultats, attaché à la session, et dans lequel je vais piocher selon le numero de la page demandée...
Mais c'est sur que ca fait sortir et conserver tous les resultats pour n'en afficher que quelques-uns




 
Bah oui, mais sur les grosses tables (avec plein d'enregistrements), c la requète SQL qui est longue, donc l'intéret de répartir les resultats est nul si la requèete SQL est tjs la même !

Reply

Marsh Posté le 07-08-2002 à 17:13:37    

R3g a écrit a écrit :

 
Ben koi, t'as jamais débuté ?
 




 
Non, ms c vrai que tu devrais un peu tester ton appli ds le cas ou il y a plusieurs utilisateurs, on sait jammais, si ça s'trouve y aura plus d'une personne à la fois sur les web-apps que tu développes ! :D
Même si t tout seul, t'as des logiciels de tests qui permettent de simuler des requètes en simultané. Moi j'utilise JMeter (google power !), c un peu chiant à prendre en main, mais vachement bien.

Reply

Marsh Posté le 07-08-2002 à 17:18:40    

El_Gringo a écrit a écrit :

 
 
Non, ms c vrai que tu devrais un peu tester ton appli ds le cas ou il y a plusieurs utilisateurs, on sait jammais, si ça s'trouve y aura plus d'une personne à la fois sur les web-apps que tu développes ! :D
Même si t tout seul, t'as des logiciels de tests qui permettent de simuler des requètes en simultané. Moi j'utilise JMeter (google power !), c un peu chiant à prendre en main, mais vachement bien.




Non en fait je développe une appli pour mon patron, il sera le seul à s'en servir, mais comme le seul logiciel qu'il maitrise c'est Internet Explorer...

Reply

Marsh Posté le 07-08-2002 à 17:19:08    

El_Gringo a écrit a écrit :

 
 
Bah ouais, ms bon, 'faut admettre que t'as un champ ID !!!
Souvent on choisis pas soit même la structure de la base de données sur laquelle notre appli diot bosser (c mon cas, et je pense pas être le seul !)



y'a un minimum quoi, t'as bien un champ qui peut faire office d'id.
si y'en a pas c'est une erreur de conception ;)

Reply

Marsh Posté le 07-08-2002 à 17:21:06    

--greg-- a écrit a écrit :

y'a un minimum quoi, t'as bien un champ qui peut faire office d'id.
si y'en a pas c'est une erreur de conception ;)




 
Chez moi y en a pas.
Et c pas moi qui ai conçu !

Reply

Marsh Posté le 07-08-2002 à 17:23:48    

R3g a écrit a écrit :

 
Ben koi, t'as jamais débuté ?
 




El_Gringo a écrit a écrit :

 
 
Non, ...



 
et a propos on vient me dire que je suis pretentieux!! :D


Message édité par --greg-- le 07-08-2002 à 17:24:03
Reply

Marsh Posté le 07-08-2002 à 17:27:31    

--greg-- a écrit a écrit :

 
et a propos on vient me dire que je suis pretentieux!! :D




 
Je m'suis fait un ennemi.
 
Un de nous 2 est de trop sur ce forum, gringo !
Dégaines si t un homme.

Reply

Marsh Posté le 07-08-2002 à 17:28:06    

:gun:

El_Gringo a écrit a écrit :

 
 
Je m'suis fait un ennemi.
 
Un de nous 2 est de trop sur ce forum, gringo !
Dégaines si t un homme.



Reply

Marsh Posté le 07-08-2002 à 17:28:26    

bon allez ça suffit le pourrissage de topic:)
ct pour rire hein  
 [:blandine]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed