Newsgroup: it.comp.java
Titolo: Java e resultset

Ciao a tutti, ho il seguente problema:
passata una query ad uno script java posso ottenere sia 1 che 1000000 di
record che vengono caricati nel resultset.
Durante il ciclo di questo resultset devo eseguire determinate operazione
che sino a quando rimango sotto i 45000/50000 record funziona tutto bene
oltre lo script va in out of memory.
C'e' un modo per prelevare i dati o processarli a blocchi di n record?
Spero di essermi spiegato.
Ciao,
cris.

Dipende tutto dal driver JDBC che stai usando. I driver JDBC ben fatti
'paginano', ovvero interagiscono con il database manager facendosi
restituire solamente un sottinsieme limitato di record, e questo
ovviamente non ti manda in out of memory. E' evidente che se il driver
si fa restituire sempre tutti i record in un volta allora va in out of
memory. A proposito che driver e che database stai usando ?
C'è un'altra possibilità... non è che il tuo pezzo di codice ad ogni
iterazione sul result set crea qualcosa e se lo mette via in memoria ?
se è così si spiega ancora più facilmente il tuo out of memory.

 se è così si spiega ancora più facilmente il tuo out of memory.
Durante il ciclo sostanzialmente apro un file appendo dei dati processando
la riga del resultset e lo chiudo e cosi via sino alla fine del ciclo.
Forse mi sfugge qualche cosa!

Se non ho letto male stai utilizzando jtds, ovvero stai lavorando con SQL
Server. Qui con la limitazione sono cavoli amari, perche' la sintassi di
limitazione e' arzigogolata (c'e' comunque un thread su
it.comp.software.database che spiega come usarla).
Le soluzioni:
 - Usare la sintassi di limitazione
 - Provare a cambiare driver JDBC
 - Verificare meglio il codice per ridurre l'occupazione di memoria.
Trucchetto banale: la tua query e' una select *? Se ti servono solo alcuni
campi pesca QUEI campi esplicitamente. Gia' questo aiuta. Poi se magari
posti il codice qualche ideuccia a qualcuno puo' venire.
Ciao,
   Francesco
-- 
---
Francesco Galli / Cinghiale Mannaro
Personal: 
http://cinghialemannaro.splinder.com
TMS project: 
http://tms.inera.it

 it.comp.software.database che spiega come usarla).
Su SqlServer non esiste LIMIT <numero_righe> come nel mySQL ?
-- 
Ciao,
 Fabrizio
=== 
http://www.negusweb.it
 ===

 Su SqlServer non esiste LIMIT <numero_righe> come nel mySQL ?
Purtroppo no!
Solo degli accrocchi!!
... comunque ho risolto con gli accrocchi :)

> Su SqlServer non esiste LIMIT <numero_righe> come nel mySQL ?
No. Esiste una SELECT TOP numero (*|campi), ma non una LIMIT.
Che poi la limit non e' <numero righe> come dici tu, ma e' <base, offset>.
Poi ci sono gli "accrocchi" che ho suggerito a Cristian, e quelli funzionano
:)
cia'
   F


Su SqlServer non esiste LIMIT <numero_righe> come nel mySQL ?
Scusa ma questa è una clausola SQL che limita il numero di record che
vengono letti... o sbaglio ? Il problema di Cristian è che deve
leggere e processare tutti i record.
Cmq la clausola esiste and per SQLServer è TOP <numero_riga>

 leggere e processare tutti i record.
Si ma con un accrocchio riesco a processare i dati simulando una limit e 
cosi ottengo tanti resultset piu' piccoli in sequenza che svuoto man mano
e cosi lo script va a buon fine.

C'e' il driver ufficiale Microsoft.

> Suggerimenti su altri driver per mssql (con questi mi trovavo bene)
http://www.microsoft.com/sql/downloads/
Driver ufficiale di Microsoft

 Che poi la limit non e' <numero righe> come dici tu, ma e' <base, offset>.
Se non specifichi la base, la imposta di default a 0.
