2012-12-19 1 views
8

Angenommen, eine ResultSet rs mit n Objekt zu haben.Ist while (rs.next()) schneller als eine Reihe von rs.solute()

Dieser Code:

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

ist algoritmically gleich diesem Code (das heißt beide ergab das gleiche Ergebnis):

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

Aber sind diese equivalant über die Bedingungen der throughouts? Ist der erste schneller? Oder, für eine gegebene i, ist rs.next() nur ein Wrapper für rs.absolute(i+1)?

Mit freundlichen Grüßen MC

+1

Was hält Sie davon ab, es selbst zu testen? Wahrscheinlich ist der Unterschied vernachlässigbar, daher sollte der Code, der leichter zu lesen ist, verwendet werden. –

+1

@ KlasLindbäck Das Schreiben eines korrekten Microbenchmarks ist überraschend [nontrivial] (http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java). –

+2

Mit 'rs.next()' müssen Sie die Größe der Ergebnismenge nicht vorher wissen, mit 'rs.absolute()' müssen Sie. Was bedeutet eine zweite Abfrage im Voraus. – BalusC

Antwort

6

rs.next erfordert eine einfachere Art von Datenbank-Cursor (FORWARD_ONLY) als rs.absolute so in den meisten Fällen werden Sie die Leistung/Ressourceneffizienz mit rs.absolute verschlechtern. In bestimmten Fällen, in denen keine Optimierung für einen FORWARD_ONLY Cursor vorhanden ist, erhalten Sie möglicherweise die gleiche Leistung.

Einige Treiber können absolute Anrufe sogar mit FORWARD_ONLY zulassen und bestätigen, dass der angeforderte Datensatz der nächste ist, aber wiederum können andere eine Ausnahme auslösen.

+0

Also, wenn ich meine PreparedStatement als prepareStatement deklariert (SQL, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); Die zwei Codeblöcke sind absolut gleich. Recht? –

+0

Dies kann im allgemeinen nicht beantwortet werden, da dies alles nur Hinweise für den Fahrer sind. Es gibt weniger Chancen auf einen Unterschied, aber ich bin mir sicher, dass es auch Gegenbeispiele gibt. –

+0

@Mariano gibt es keine Möglichkeit, dies zu bestätigen, da dies stark von der Implementierung des Treibers und dem Verhalten der zugrunde liegenden Datenbank abhängt. Im Allgemeinen würde ich sagen: benutze 'rs.next()', wenn du sequentiell durch ein ResultSet gehen willst, aber das ist nur ein Bauchgefühl –

2

Die ehemalige rs.next() könnte schneller sein, obwohl es von der zugrunde liegenden Implementierung abhängt und in der Realität können Sie die gleiche Leistung aufgrund der internen Optimierungen erhalten.

Der Fahrer könnte die aktuelle Position nicht berücksichtigen, wenn er rs.absolute() tut, also könnte es leicht ein wenig Overhead haben, während in rs.next() seine einzige Vorwärtsbewegung ist.

Wenn Sie also alle Ergebnisse durchlaufen müssen, verwenden Sie einfach rs.next(), wenn Sie zu einem bestimmten Ergebnis springen müssen, verwenden Sie rs.absolute().

Denken Sie daran, dass die Ergebnismenge in der Tat oft remote von der Datenbank gehandhabt wird (es sei denn, es ist eine CachedResultSet), also hin und her gehen könnte mehr Overheadkosten als Sie denken.

Verwandte Themen