Frage

Gibt es eine Möglichkeit, ein ResultSet Sie läuft eine JDBC-Abfrage erhalten zu bekommen faul-geladen werden? Ich mag jede Zeile geladen werden, wie ich es beantragen, und nicht vorher.

War es hilfreich?

Lösung

Kurze Antwort:

Verwenden Statement.setFetchSize(1) vor executeQuery() aufrufen.

Lange Antwort:

Das hängt sehr viel auf dem JDBC-Treiber Sie verwenden. Vielleicht haben Sie einen Blick auf dieser Seite nehmen wollen , die das Verhalten von MySQL beschreibt, Oracle, SQL Server und DB2.

Wichtiger Take-Aways:

  • Jede Datenbank (das heißt jeder JDBC-Treiber) eine eigene Standardverhalten hat.
  • wird Einige Fahrer respektieren setFetchSize() ohne Vorbehalte, während andere eine „Hilfe“ benötigen.

MySQL ist ein besonders seltsamer Fall. Siehe diesem Artikel . Es klingt wie, wenn Sie setFetchSize(Integer.MIN_VALUE) nennen, dann wird es die Zeilen einen nach dem anderen herunterladen, aber es ist nicht ganz klar.

Ein weiteres Beispiel: hier ist die Dokumentation für die PostgreSQL Verhalten. Wenn autocommit eingeschaltet ist, dann wird das ResultSet wird holen alle Zeilen auf einmal, aber wenn es ausgeschaltet ist, dann können Sie setFetchSize() verwenden, wie erwartet.

Eine letzte Sache im Auge zu behalten: Diese JDBC-Treiber-Einstellungen wirken sich nur auf, was auf der Client-Seite geschieht. Der Server kann immer noch das gesamte Ergebnis in dem Speicher geladen werden eingestellt, aber Sie können steuern, wie die Client Downloads die Ergebnisse.

Andere Tipps

Könnten Sie nicht dieses Ziel zu erreichen, indem die Fetch-Größe für Ihre Erklärung auf 1 setzen?

Wenn Sie nur holen 1 Zeile auf jede Zeilenzeit sollte nicht geladen werden, bis zum nächsten () auf der ResultSet genannt.

z.

Statement statement = connection.createStatement();
statement.setFetchSize(1);
ResultSet resultSet = statement.executeQuery("SELECT .....");
while (resultSet.next())
{
  // process results. each call to next() should fetch the next row
}

Ich denke, was würden Sie tun möchten, verschieben ist das Laden tatsächlich der ResultSet selbst. Sie würden die manuell implementieren müssen.

Es gibt eine Antwort zur Verfügung gestellt hier .

Zitat:

  

Der Presto JDBC-Treiber nie puffert das gesamte Ergebnis im Speicher gesetzt. Der Server-API wird höchstens zurückgeben ~ 1 MB Daten an den Fahrer pro Anfrage. Der Fahrer wird nicht mehr Daten vom Server anfordern, bis die Daten (durch den Aufruf der Methode next() auf ResultSet eine entsprechende Anzahl) verbraucht ist.

     

Wegen, wie der Server-API arbeitet, holen die Fahrer Größe ignoriert wird (gemäß der JDBC-Spezifikation, es ist nur ein Hinweis).

Zeigen Sie, dass der setFetchSize ignoriert

Sie finden diese viel einfacher mit Hibernate . Sie werden im Grunde Roll-your-own müssen, wenn Sie jdbc direkt verwenden.

Die Fetching-Strategien in Hibernate sind in hohem Maße konfigurierbar, und wird höchstwahrscheinlich bieten Performance-Optionen Sie waren nicht einmal bewusst.

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