Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was macht die Methode Statement.setFetchSize(nSize) wirklich im SQL Server JDBC-Treiber?

In JDBC ist die setFetchSize(int) -Methode ist sehr wichtig für die Leistung und Speicherverwaltung innerhalb der JVM, da sie die Anzahl der Netzwerkaufrufe von der JVM an die Datenbank und entsprechend die Menge an RAM steuert, die für die ResultSet-Verarbeitung verwendet wird.

Wenn setFetchSize(10) aufgerufen wird und der Treiber es ignoriert, gibt es wahrscheinlich nur zwei Optionen:

  1. Versuchen Sie einen anderen JDBC-Treiber, der den Fetch-Size-Hinweis berücksichtigt.
  2. Schauen Sie sich die treiberspezifischen Eigenschaften der Verbindung an (URL und/oder Eigenschaftszuordnung beim Erstellen der Verbindungsinstanz).

Das RESULT-SET ist die Anzahl der Zeilen, die als Antwort auf die Abfrage in die DB gemarshallt werden. Das ROW-SET ist der Teil der Zeilen, die aus dem RESULT-SET pro Aufruf von der JVM an die DB geholt werden. Die Anzahl davon -Aufrufe und der resultierende Arbeitsspeicher, der für die Verarbeitung erforderlich ist, hängt von der Einstellung für die Abrufgröße ab.

Wenn das RESULT-SET also 100 Zeilen hat und die Abrufgröße 10 ist, gibt es 10 Netzwerkaufrufe, um alle Daten abzurufen, wobei zu jeder Zeit ungefähr 10*{row-content-size} RAM verwendet werden.

Die Standardabrufgröße ist 10, was ziemlich klein ist. In dem geposteten Fall scheint es, als würde der Treiber die Einstellung der Abrufgröße ignorieren und alle Daten in einem Aufruf abrufen (große RAM-Anforderung, optimale minimale Netzwerkaufrufe).

Was unter ResultSet.next() passiert ist, dass es nicht wirklich eine Zeile auf einmal aus dem RESULT-SET holt. Es holt das aus dem (lokalen) ROW-SET und holt das nächste ROW-SET (unsichtbar) vom Server, wenn es auf dem lokalen Client erschöpft ist.

All dies hängt vom Treiber ab, da die Einstellung nur ein „Hinweis“ ist, aber in der Praxis habe ich festgestellt, dass dies für viele Treiber und Datenbanken so funktioniert (in vielen Versionen von Oracle, DB2 und MySQL verifiziert).