Frage

Wenn JDBC verwenden, habe ich oft über Konstrukte kommen wie

ResultSet rs = ps.executeQuery();
while (rs.next()) {
    int id = rs.getInt(1);
    // Some other actions
}

Ich habe mich gefragt (und Autoren von Code auch), warum keine Etiketten zu verwenden, um Spaltenwerte abrufen:

int id = rs.getInt("CUSTOMER_ID");

Die beste Erklärung, die ich gehört habe, ist etwas über die Leistung. Aber eigentlich macht es extrem schnelle Verarbeitung? Ich glaube nicht so, obwohl ich noch nie Messungen durchgeführt. Auch wenn durch Etikett Abrufen wäre ein bisschen langsamer, doch sein, bieten sie eine bessere Lesbarkeit und Flexibilität, meiner Meinung nach.
So könnte mir jemand eine gute Erklärung zu vermeiden Spaltenwerte durch Spaltenindex anstelle der Spaltenbeschriftung abrufen? Was sind Vor- und Nachteile beider Ansätze (vielleicht über bestimmte DBMS)?

War es hilfreich?

Lösung

Sie verwenden sollten, string Etiketten standardmäßig aktiviert.

Vorteile:

  • Unabhängigkeit der Spaltenreihenfolge
  • Bessere Lesbarkeit / Wartbarkeit

Nachteile:

  • Sie haben keine Kontrolle über die Spaltennamen (Zugriff über gespeicherte Prozeduren)

Welche würden Sie bevorzugen?

ints?

  

int i = 1;
   customerId = resultSet.getInt (i ++);
   customer = ResultSet.getString (i ++);
   Customer = ResultSet.getString (i ++);

oder Strings?

  

customerId = resultSet.getInt ( "customer_id");
   customer = ResultSet.getString ( "customer_name");
   Customer = ResultSet.getString ( "customer_address");

Und was, wenn es eine neue Spalte an Position 1 eingeführt ist? Welcher Code würden Sie bevorzugen? Oder wenn die Reihenfolge der Spalten geändert wird, die Code-Version würden Sie brauchen überhaupt ändern?

Aus diesem Grund sollten Sie string Etiketten verwenden standardmäßig.

Andere Tipps

. Achtung: Ich werde hier bombastisch bekommen, denn dies macht mich verrückt

99% * der Zeit, es ist eine lächerliche Mikro-Optimierung, die Menschen etwas vage Vorstellung haben, macht die Dinge ‚besser‘. Diese völlig ignoriert die Tatsache, dass, wenn Sie in einer extrem engen und beschäftigt Schleife über Millionen von SQL Ergebnissen die ganze Zeit sind, die hoffentlich selten ist, werden Sie nie bemerken. Für alle, die das nicht tun, dem Entwickler Zeit Kosten maintaing, Aktualisierung und Beheben von Fehlern in der Spalte Indizierung ist weit größer als die zusätzlichen Kosten der Hardware für Ihre infinitesimally-schlechter-performing-Anwendung.

Sie keine Code-Optimierungen wie dies in.-Code für die Person, die es zu halten. Dann beobachten, messen, analysieren und zu optimieren. Beachten Sie wieder, erneut messen, analysieren wieder und optimieren wieder.

Die Optimierung ist so ziemlich der letzte Schritt in der Entwicklung, nicht das erste.

* Abbildung besteht aus.

Die Antwort wird akzeptiert, none-the-less, hier einige zusätzliche Informationen und persönliche Erfahrung, die ich noch nicht vorbringen gesehen habe.

Verwenden Sie Spaltennamen (Konstanten und nicht Literalen ist bevorzugt) im Allgemeinen und, wenn möglich. Dies ist sowohl klarer, einfacher ist, zu halten und zukünftige Änderungen sind weniger wahrscheinlich, um den Code zu brechen.

Es gibt jedoch auch eine Verwendung für Spaltenindizes. In einigen Fällen handelt es sich schneller, aber nicht ausreichend, dass dies die oben genannten Gründe für die Namen überschreiben *. Diese sind sehr wertvoll, wenn Werkzeuge zu entwickeln und allgemeine Methoden Umgang mit ResultSets. Schließlich kann ein Index erforderlich sein, da die Spalte keinen Namen hat (wie zum Beispiel eines ungenanntes Aggregat) oder es gibt doppelte Namen, so gibt es keine einfache Möglichkeit, sowohl zu verweisen.

* Bitte beachte, dass ich einige JDBC-Treiber geschrieben habe, und schaute in einigen offenen Quellen ein und intern diese Verwendung Spaltenindizes die Ergebnisspalten zu verweisen. In allen Fällen, mit denen ich gearbeitet habe, ordnet der interne Treiber zunächst einen Spaltennamen in einem Index. So können Sie leicht erkennen, dass der Spaltenname, in all diesen Fällen immer länger dauern würde. Dies kann zwar für alle Fahrer nicht wahr sein.

Von der Java-Dokumentation:

  

Die ResultSet Schnittstelle stellt Methoden Getter (getBoolean, getLong, und so weiter) für die Spaltenwerte aus der aktuellen Zeile abgerufen werden. Werte können entweder die Indexnummer der Spalte oder den Namen der Spalte abgefragt werden. Im Allgemeinen wird den Spaltenindex unter Verwendung effizienter. Die Spalten werden von 1. Für maximale Portabilität nummerieren, Satz Spalten führen in jeder Zeile sollte in von links nach rechts gelesen werden, und jede Spalte nur einmal gelesen werden.

Natürlich jede Methode (benannt oder indiziert) hat seinen Platz. Ich bin damit einverstanden, dass benannten Spalten sollte der Standard sein. Jedoch in Fällen, in denen eine große Anzahl von Schleifen erforderlich sind, und wo die SELECT-Anweisung definiert ist und in dem gleichen Code-Abschnitt (oder Klasse) erhalten, sollten Indizes in Ordnung sein - ist es ratsam, die Spalten werden ausgewählt aufzulisten, nicht nur "SELECT * FROM ...", da jede Tabelle ändern Sie den Code brechen wird.

Sicher, erhöht mit Spaltennamen Lesbarkeit und macht die Wartung einfach. Aber Spaltennamen hat eine Kehrseite. Wie Sie wissen, können SQL mehrere Spaltennamen mit dem gleichen Namen, gibt es keine Garantie, dass der Spaltenname Sie in der Getter-Methode von resultSet getippt Sie tatsächlich verweist auf den Spaltennamen für den Zugriff auf die Absicht. In der Theorie wird mit Indexnummern anstelle von Spaltennamen preffered, aber es reduziert die Lesbarkeit ...

Danke

Ich glaube nicht, die Etiketten Auswirkungen Leistung durch viel verwendet wird. Aber es ist ein weiterer Grund, nicht Strings zu verwenden. Oder ints, was das betrifft.

Betrachten Sie Konstanten verwenden. Mit Hilfe eines int Konstante macht mehr der Code lesbar, sondern auch weniger wahrscheinlich, dass Fehler haben.

Neben mehr lesbar ist, auch die Konstante verhindert, dass Sie machen Tippfehler in den Markennamen - der Compiler einen Fehler aus, wenn Sie das tun. Und jedes IDE etwas wert wird es abholen. Dies ist nicht der Fall, wenn Sie Strings oder ints verwenden.

Ich habe einige Leistungsprofile exakt zu diesem Thema auf einer Oracle-Datenbank. In unserem Code haben wir ein ResultSet mit zahlreichen Säulen und eine große Anzahl von Zeilen. Von den 20 Sekunden (!) Hat die Anfrage Methode oracle.jdbc.driver.ScrollableResultSet.findColumn (String name) dauert ca. 4 Sekunden auszuführen.

Offensichtlich gibt es etwas falsch mit dem Gesamtdesign, sondern Indizes anstelle der Spaltennamen verwenden würde entfernt 4 Sekunden wahrscheinlich nehmen.

Sie können haben das Beste von beiden! Die Geschwindigkeit des Indizes mit der Wartbarkeit und Sicherheit der Verwendung von Spaltennamen verwenden.

Erste -., Wenn Sie durch ein Ergebnis sind Looping gesetzt nur Spaltennamen verwenden

  1. definieren eine Reihe von Integer-Variablen, eine für jede Spalte finden Sie zugreifen. Die Namen der Variablen können Sie den Namen der Spalte sind: z iLast_Name.

  2. vor dem Ergebnis eingestellt Schleife iterieren durch die Säule Metadaten und den Wert jedes ganzzahlige Variable auf den Spaltenindex des entsprechenden Spaltennamen. Wenn der Index der Spalte 'Last_Name' 3 setzen Sie den Wert von 'iLast_Name' bis 3.

  3. in der Ergebnismenge Schleife die Variablennamen integer verwendet in den GET / SET-Methoden. Der Variablenname ist ein visueller Hinweis auf den Entwickler / Betreuer in Bezug auf die tatsächlichen Spaltennamen zugegriffen wird, aber der Wert ist der Spaltenindex und die beste Leistung geben.

. HINWEIS: die anfängliche Mapping (das heißt Spaltennamen zu indizieren mapping) nur erfolgt einmal vor der Schleife, anstatt für jeden Datensatz und Spalte in der Schleife

Der JDBC-Treiber übernimmt für den Spalt Index Look-up. Wenn Sie also Werte von Spaltennamen jedes Mal extrahieren macht den Fahrer ein Look-up (in der Regel in Hash-Map), um den entsprechenden Index für die Spaltennamen zu überprüfen.

Ich stimme mit früheren Antworten, dass die Leistung ist nicht etwas, das uns zwingen kann, eine der beiden Ansätze zu wählen. Es wäre gut, folgende Dinge zu beachten, statt:

  • Code-Lesbarkeit. Für jeden Entwickler Lesen Sie den Code-Etiketten haben viel mehr Sinn als Indizes
  • Wartung: Man denke an die SQL-Abfrage und die Art und Weise es eingehalten wird. Was ist wahrscheinlicher, in Ihrem Fall geschieht nach dem Fixieren / verbessernde / Refactoring SQL-Abfrage: die Reihenfolge der Spalten extrahierten Ändern oder Ergebnisspaltennamen zu ändern. Es ist für mich scheint, dass die Reihenfolge der (wie die Ergebnisse der Hinzufügen / Löschen von neuen Spalten in Ergebnismenge) extrahiert Spalten zu ändern größere Wahrscheinlichkeit muss passieren.
  • Encapsulation: trotz der Art und Weise Sie versuchen, wählen Sie den Code zu isolieren, wo Sie SQL-Abfrage ausführen und analysieren in der gleichen Komponente Ergebnismenge und diese Komponente nur bewusst über die Spaltennamen und deren Zuordnung zu den Indizes machen (wenn Sie sich entschieden sie benutzen).

den Index ist ein Versuch, bei Optimierung.

Die Zeit, die diese gespeichert wird durch den zusätzlichen Aufwand verschwendet es die Entwickler nimmt die notwendigen Daten nachschlagen zu überprüfen, ob ihr Code ordnungsgemäß nach den Änderungen funktionieren.

Ich denke, es ist unsere integrierte in Instinkt Zahlen verwenden anstelle von Text.

Neben dem Blick nach oben in der Karte für Etiketten es führt auch zu einer zusätzlichen String Schöpfung. Obwohl es wird auf Stapel geschieht aber immer noch Karies es eine Kosten mit sich.

Es hängt alles von der individuellen Wahl und bis heute habe ich nur Indizes verwendet: -)

Wie es von anderen Plakaten darauf hingewiesen wird, würde ich auf Spaltennamen bleiben, wenn Sie einen wirklich triftigen Grund haben dies nicht zu tun. Die Auswirkungen in der Leistung ist vernachlässigbar im Vergleich zu zum Beispiel der Abfrageoptimierung. In diesem Fall ist die Wartung viel wichtiger als eine kleine Feld-Optimierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top