2012-10-15 6 views
5

stavo usando qualcosa di così lontano come questo per l'interrogazione mio database che stava funzionando benissimo:JDBC Oracle prestazioni del ResultSet

PreparedStatement prepStmt = dbCon.prepareStatement(mySql); 
ResultSet rs = prepStmt.executeQuery(); 

Ma poi ho bisogno di usare il rs.first(); al fine di essere in grado di iterare il mio rs più volte. Quindi ora lo uso

PreparedStatement prepStmt = dbCon.prepareStatement(mySql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);  

La mia domanda è legata alla prestazione dei due. Cosa posso perdere se utilizzo la seconda opzione? L'uso della seconda opzione avrà qualche effetto negativo nel codice che ho scritto finora?

PS: Si noti che la mia applicazione è un'applicazione web multiutente con utilizzo di database (su Weblogic 10.3.4) che utilizza un database Oracle 11g di back-end.

Grazie a tutti per la vostra attenzione.

UPDATE

mio dimensione massima reslutset sarà inferiore a 1000 righe e colonne 15-20

+0

Perché la costruzione di un '' elenco da ResultSet e quindi utilizzando tale POJO invece, dove si vuole, non è un'opzione? È sempre più facile gestire 'Lista ', comparativamente. Voglio dire roba di tipo dati, passando il numero di colonna, o il nome, non si applica lì. –

+0

Sì, era quello che avevo in mente quando ho fatto la domanda. Se ho un problema di prestazioni userò sicuramente questo approccio – MaVRoSCy

+0

@AdeelAnsari, che potrebbe non essere un'opzione del set di risultati è abbastanza grande. – Santosh

risposta

3

Poiché un cursore Oracle è un inoltro solo la struttura, in modo da simulare un cursore scorrevole, la Il driver JDBC in genere dovrebbe memorizzare nella cache i risultati in memoria se vuole essere in grado di garantire che gli stessi risultati vengano restituiti quando si ripetono i risultati una seconda volta. A seconda del numero e della dimensione dei risultati restituiti dalla query, ciò può comportare una notevole quantità di memoria aggiuntiva consumata sul server delle applicazioni. D'altro canto, ciò dovrebbe significare che una iterazione attraverso la ResultSet una seconda volta dovrebbe essere molto più efficiente della prima volta.

Se la memoria aggiuntiva richiesta è significativa dipende dall'applicazione. Tu dici che il più grande ResultSet avrà 1000 righe. Se pensi che ogni riga sia di 500 byte (questo dipenderà ovviamente dai tipi di dati - se il tuo numero ResultSet ha solo un mucchio di numeri, sarebbe molto più piccolo, se contiene un mucchio di lunghe stringhe descrittive, potrebbe essere molto più grande), 1000 righe sono 500 kb per utente. Se hai 1000 utenti simultanei, sono solo 500 MB di spazio di archiviazione che probabilmente non sono proibitivi. Se hai 1 milione di utenti simultanei, d'altra parte, sono 500 GB, il che probabilmente significa che stai acquistando alcuni nuovi server. Se le tue righe sono 5000 byte anziché 500, allora stai parlando di 5 GB di RAM che potrebbero essere una grande parte della memoria richiesta sul server delle applicazioni per eseguire l'applicazione.

+0

Quindi cosa suggeriresti? – MaVRoSCy

+0

@MaVRoSCy - Dipende dalle tue esigenze. Se il tuo 'ResultSet' è piccolo e hai un sacco di RAM sui server delle applicazioni, potrebbe essere perfettamente ragionevole usare set di risultati scorrevoli. In caso contrario, potrebbe essere necessario prendere in considerazione altre opzioni. Alcuni sistemi potrebbero essere in grado di chiudere e riaprire il 'ResultSet' che costringe Oracle a rieseguire la query e potrebbe fornire risultati diversi se le modifiche sono state eseguite dopo l'esecuzione della prima query. Alcuni sistemi possono essere in grado di memorizzare nella cache un sottoinsieme di dati (cioè un sottoinsieme di colonne) in una raccolta locale. –

9

Se stai usando scrollabilità (la tua seconda opzione), prestare attenzione a questo:

Importante: poiché tutte le righe di qualsiasi set di risultati a scorrimento vengono memorizzati nella cache lato client, una situazione in cui il set di risultati contiene molte righe , molte colonne o colonne molto grandi potrebbero causare il malfunzionamento della Java Virtual Machine (JVM) lato client . Non specificare la scrollabilità per un set di risultati grande .

Fonte: Oracle Database JDBC Developer's Guide and Reference

+0

Questo è stato davvero utile, Grazie – MaVRoSCy

+0

Prego! –