Newsgroup: it.comp.java
Titolo: Gestione pagine html (es. Google)

Ciao a tutti,
sto mettendo le mani su un prodotto sviluppato (con le JSP) mesi fa da una
azienda che oggi non esiste più.
Questo prodotto contiene un jsp che visualizza il risultato di una ricerca
su una tabella anagrafica. La tabella in questione contiene 200 record ma
tra qualche giorno verrà popolata con circa un milione di record.
Ora, capite bene che la pagina html generata dalla jsp potrebbe contenere
migliaia di dati e questo è assurdo.
Stavo pensando di utilizzare il concetto delle pagine (come fa Google e
similari) ma non ho la più pallida idea di come fare.
Qualcuno ha risolto questo problema?
Esiste un rete qualcosa che possa indicarmi la strada giusta?
Ho l'impressione che le semplici jsp non siano sufficenti e che gli EJB
siano l'unica strada (anche se non so come).
Ciao e grazie.
CC


Gli ejb non c'entrano molto.
Se vuoi li puoi usare ma servono per migliorare l'architettura, non le
funzionalita'
Devi gestire un po' il resultset via codice.
Ti butto li 2 o 3 concetti
1) nella jsp ti metti un bean ( classe java ) che svuota i dati in memoria e
poi ne fa visualizzare un po' alla volta
2) se usi struts e' molto meglio cosi' la jsp non diventa una porcheria
3) se l'applicazione e' strategica usa anche gli ejb ma complichi un po' il
tutto
4) se i dati sono troppi si complica un pochino perche non puoi svuotare
tutto il resultset in memoria.
in questo caso butto li altri 2 o 3 concetti:
4a) scarichi solo le chiavi e poi richiedi i dati dei buquet delle singole
pagine
4b) cachizzi su file il resultset. Questa e' la + efficiente ma poco
elegante/No J2ee e sopratttuto su molte macchine non ti andra' perche non
hai i grants di scrittura
4c) fai query che restituiscono resultset + piccoli. Credo sia la strada
migliore
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 siano l'unica strada (anche se non so come).
E come pensi di fare sta cosa con gli EJB (eseguendo ogni volta che cambi
pagina delle query?), questo è puramente un problema di front end,
risolvibile con le jsp.
G.M.


wrote:
In realta' potresti usare meccanismi di fetch dei record in un
ipotetico ResultSet, cmq la documentazione e' abbastanza chiara, la
paginazione la puoi ottenere definendo il numero di record da
visualizzare e la posizione nel record.
ciao


 ha scritto nel messaggio
news:hlpqe05eegka0o0ee...@4ax.com...


 similari) ma non ho la più pallida idea di come fare.
In molti ti hanno proposto di memorizzare in memoria tutti i dati per 
poi visualizzarli un po' per volta.
E' una soluzione buona se comunque i dati da visualizzare non sono 
moltissimi (ad esempio se si parla di un milione di righe, non e' 
pensabile) e se il costo di rieseguire la query e' abbastanza alto 
(join, condizioni particolarmente costose, ecc.).
Se al contrario i dati sono troppi per essere tenuti in memoria e il 
costo di esecuzione della query non e' eccessivo conviene che ad ogni 
richiesta la ripeti per poi visualizzare solo una parte dei dati.
L'ideale sarebbe poter modificare la query in modo da tirare fuori ogni 
volta solo i dati che ti interessano (o almeno escludere una parte dei 
dati che non sono interessanti). Ad esempio (sto inventando su due 
piedi) se stai visualizzando un elenco di persone ordinato per cognome 
potresti utilizzare una paginazione basata sulla prima lettera del 
cognome. Ogni volta che esegui la query filtri sulla prima lettera 
dell'ultimo cognome visualizzato, scarti tutto quello che viene tirato 
fuori fino all'ultima riga della pagina precedente e poi prendi i 100 
nomi successivi. Se i nomi che hai tirato fuori non bastano riesegui la 
query con la lettera successiva dell'alfabeto.
Se la query cosi' filtrata ti tira fuori un numero sufficientemente 
basso di record puoi anche decidere di bufferizzarli, utilizzando un 
approccio misto.
Spero di averti dato qualche spunto utile.
Andrea

Andrea ha ragione, se tiri fuori tutti i record che ti servono e poi
li memorizzi sul server rischi di impiantare il server nel giro di un
giorno.
Prendi la query, aggiungi un ORDER BY, aggiungici un LIMIT e quindi
memorizza (ad esempio in una session) il numero di record che hai
estratto fino ad adesso (il parametro di start del limit). cliccando
su un link o qualcos'altro richiama la stessa pagiona passando, ad
esempio, un parametro (in get se usi i link, in post se usi un form)
che indichi se vuoi scorrere in avanti od  in dietro i tuoi record.
io ho usato questa soluzione in piu' pagine ed ha sempre funzionato
senza troppi problemi di prestazioni.


Secondo me questa è la strada migliore, ancora migliore di usare una 
session sarebbe secondo me passare i parametri via url. In pratica la 
pagina riceve 2 dati via url: numero di record per pagina (questo è 
opzionale, puoi anche metterlo direttamente nel codice) e il numero di 
pagina da visualizzare (magari se non specificato sottintendi 1). 
Calcoli il numero delle pagine eseguendo una query solo per avere il 
numero di record restituiti dalla tua ricerca. Ad ogni esecuzione della 
pagina generi i due link precedente e successivo (ovvio che se la pagina 
è 1 non serve precedente, mentre se la pagina è l'ultima non serve 
successivo... oppure fai in modo che dalla prima si salti all'ultima e 
viceversa). Ulteriori miglioramenti potrebbero prevedere la possibilità 
di accedere direttamente ad un numero di pagina con un link apposito per 
ognuna, oppure per quelle vicine e link aggiuntivi per saltare alla 
prima ed all'ultima pagina.
Quando viene chiamata una pagina controlli i parametri con l'url e fai 
la query con LIMIT, sapendo che il primo record da prendere è numero 
pagina * record per pagina, e l'ultimo è primo record + records per 
pagina, eventualmente controllando che l'ultimo record richiesto non sia 
oltre il numero totale di record.
Spero di esserti stato utile :)