2012-12-19 11 views
8

Supponiamo di avere un ResultSet rs con l'oggetto n.È mentre (rs.next()) più veloce di una serie di rs.absolute()

Questo codice:

while(rs.next()) { 
    // do something on rs 
} 

è algoritmically uguale a questo codice (cioè sia dato lo stesso risultato):

for(i=1; i<=n; i++) { 
    rs.absolute(i) 
    // do something on rs 
} 

Ma sia esso equivalant sui termini di throughouts? È il primo più veloce? Oppure, per un dato i, rs.next() è solo un wrapper per rs.absolute(i+1)?

migliori saluti MC

+1

Cosa ti impedisce di testarlo da solo? Molto probabilmente, la differenza è irrilevante, quindi è necessario utilizzare il codice più facile da leggere. –

+1

@ KlasLindbäck Scrivere un microbenchmark corretto è sorprendentemente [non banale] (http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java). –

+2

Con 'rs.next()' non è necessario conoscere prima la dimensione del set di risultati, con 'rs.absolute()' è necessario. Il che significa in anticipo una seconda query. – BalusC

risposta

6

rs.next richiede una sorta di semplice cursore del database (FORWARD_ONLY) rispetto rs.absolute così nella maggior parte dei casi si diminuisce l 'efficacia delle prestazioni/risorsa con rs.absolute. In alcuni casi, dove non c'è ottimizzazione per un cursore , è possibile che si ottenga la stessa prestazione.

Alcuni driver possono consentire le chiamate absolute anche con FORWARD_ONLY, convalidando che il record richiesto è il successivo, ma anche in questo caso altri potrebbero lanciare un'eccezione indipendentemente.

+0

Quindi, se dichiarassi PreparedStatement come prepareStatement (SQL, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); i due blocchi di codice sono assolutamente uguali. Destra? –

+0

Questo non può essere risolto in generale, perché questi sono solo suggerimenti per il conducente. C'è meno possibilità di differenza, è vero, ma sono sicuro che ci sono anche controesempi. –

+0

@Mariano non c'è modo di confermarlo, poiché dipenderà fortemente dall'implementazione del driver e dal comportamento del database sottostante. In generale, direi: usa 'rs.next()' se vuoi passare attraverso un ResultSet in sequenza, ma è solo una sensazione istintiva –

2

L'ex rs.next() potrebbe essere più veloce, anche se dipende dall'implementazione sottostante e in realtà si potrebbero ottenere le stesse prestazioni a causa delle ottimizzazioni interne.

Il driver potrebbe non prendere in considerazione la posizione corrente quando si esegue rs.absolute() in modo che potrebbe avere un po 'sovraccarico, mentre in rs.next() è solo andare avanti.

Quindi, se è necessario scorrere tutti i risultati, utilizzare solo rs.next(), se è necessario saltare a un risultato specifico utilizzare rs.absolute().

Ricordare che il set di risultati viene spesso gestito in remoto dal database (a meno che non sia un CachedResultSet), quindi andare avanti e indietro potrebbe comportare più spese generali di quanto si pensi.

Problemi correlati