JDBC Fetch Size

Prev Next

Wenn die Lobster Data Platform eine Datenbank über eine Verbindung im Modus Via Bridge (Standard) abfragt, ruft sie die Ergebnisse in Stapeln ab. Die Fetch Size steuert zwei Werte:

  • wie viele Zeilen die Bridge in einer HTTP-Antwort an die Plattform überträgt,

  • wie viele Zeilen der JDBC-Treiber der Bridge pro DB-Roundtrip aus der Datenbank vorablädt.

Der Standardwert beträgt 500 Zeilen pro HTTP-Antwort, sofern auf keiner der beiden Seiten ein Wert konfiguriert ist.

Bei Verbindungen mit vielen schmalen Zeilen (z. B. ID-Abfragen, Referenztabellen) verringert eine höhere Fetch Size die Zahl der HTTP-Roundtrips zwischen Plattform und Bridge und erhöht den Durchsatz. Es gilt jedoch ein HTTP-Antwortlimit von 2 MB. Siehe Abschnitt /v1/docs/jdbc-fetch-size#bekannte-einschränkung-2mbhttplimit.

Konfiguration über die Bridge-JVM-Property (primär)

-Dde.lobster.remoteJdbc.fetchSize=<N>

Wird im Bereich der JVM-Argumente in der Datei ./bin/bridge.json der Bridge-Installation gesetzt. Diese eine Property steuert beide Ebenen gleichzeitig:

  • HTTP batch size (Bridge zur Plattform): Die Bridge verwendet N als frame size und überschreibt damit den von der Plattform angeforderten Wert.

  • DB cursor size (Bridge zur Datenbank): Die Bridge ruft vor dem Lesen ResultSet.setFetchSize(N) auf und gleicht so den internen Prefetch des JDBC-Treibers an. Dies ist ein Hinweis; einige Treiber ignorieren ihn (siehe Abschnitt /v1/docs/jdbc-fetch-size#datenbankspezifisches-verhalten-von-resultsetsetfetchsize).

Fehlt die Property, verwendet die Bridge die von der Plattform angeforderte batch size (Standard 500) und ruft setFetchSize() nicht auf.

Bekannte Einschränkung: 2-MB-HTTP-Limit

Der HTTP-Client des RemoteJdbcDriver (Jetty) hat einen fest eingestellten Antwortpuffer von 2 MB.

Eine Überschreitung erzeugt folgende Meldung (siehe Control Center > Logs > Meldungen pro Profil):

java.lang.IllegalArgumentException: Buffering capacity 2097152 exceeded

Das 2-MB-Limit erlaubt beim Standardwert von 500 Zeilen im Mittel etwa 4 KB pro Zeile (inklusive Protobuf-Overhead). Für Verbindungen mit breiten Zeilen oder LOB-Spalten liegt der Wert für N bei 100–200.

Überschreitet eine einzelne Antwort 1,7 MB, schreibt die Bridge eine WARN-Meldung in das Bridge-Log, höchstens einmal alle 10 Minuten. Da die Warnschwelle unter dem Limit liegt, geht die WARN-Meldung im Bridge-Log dem clientseitigen Fehler voraus.

WARN  de.lobster.remote.RemoteJdbcServlet - SYSTEM:DATAWIZARD:TUNNEL response size 1823456 bytes for alias 'mydb' approaches the 2 MB Jetty client limit — reduce -Dde.lobster.remoteJdbc.fetchSize to avoid 'Buffering capacity 2097152 exceeded'

Datenbankspezifisches Verhalten von ResultSet.setFetchSize()

setFetchSize() ist unverbindlich (ein JDBC-Hint). Der Treiber kann den Wert befolgen oder ignorieren. Beispiele:

Datenbank

Verhalten

PostgreSQL

Wird bei autocommit=true (Standard der Plattform) ignoriert: Alle Zeilen werden auf einmal in den Bridge-Heap geladen; kein serverseitiger Cursor. Wirkt nur mit autocommit=false.

MySQL / MariaDB

Positive Werte puffern zuerst alle Zeilen im Heap. Echtes Streaming erfordert Integer.MIN_VALUE und useCursorFetch=true. Alle Zeilen liegen unabhängig von der gesetzten Fetch Size im Bridge-Heap.

SQL Server

Adaptive Pufferung (Standard): große Ergebnismengen werden automatisch gestreamt; die Fetch Size hat dabei geringe Wirkung. Mit selectMethod=cursor wird die Fetch Size berücksichtigt.

Oracle

Standard-Prefetch: 10 Zeilen. setFetchSize(N) wird gut berücksichtigt – 500 reduziert DB-Roundtrips deutlich. Breite Zeilen oder LOBs können mit 500 Zeilen das 2-MB-Limit überschreiten; bei Bedarf weiter reduzieren.

H2 / HSQLDB

Wird meist ignoriert; alle Zeilen werden auf einmal abgerufen.

Weitere Parameter

 HINWEIS:

Die Konfiguration in ./bin/bridge.json ist der empfohlene Weg. Die Property lässt sich je Bridge-Instanz unabhängig einstellen, und die Änderung wird bereits mit einem Neustart der Bridge wirksam. Ein Neustart der Plattform ist deutlich störender.

Platform-JVM-Property (Via Bridge (Standard))

-Dde.lobster.remoteJdbc.fetchSize=<N>

Wird im Bereich der JVM-Argumente in der Datei ./bin/platform.json der Plattform gesetzt. Steuert nur die HTTP batch size, also wie viele Zeilen die Plattform pro Antwort anfordert. Die Bridge verwendet diesen Wert, wenn sie keine eigene Property gesetzt hat. Der DB-Cursor auf der Bridge-Seite wird nicht beeinflusst.

Die JDBC-URL akzeptiert zusätzlich einen verbindungsbezogenen Parameter fetch_size=N. Die Plattform erzeugt die URL jedoch automatisch; sie ist nicht durch Anwender editierbar.

Bridge-JVM-Property (Via Bridge (Legacy))

-Dde.lobster.tunnel.fetchSize=<N>

Wird im Bereich der JVM-Argumente in der Datei ./bin/bridge.json der Bridge-Installation gesetzt. Gilt nur für den älteren TunnelDriver, also für Verbindungen im Modus Via Bridge (Legacy). Ruft vor dem Materialisieren der Ergebnismenge ResultSet.setFetchSize(N) auf und wirkt nur auf den DB-Cursor. Die vollständige Ergebnismenge wird weiterhin in einer einzigen HTTP-Antwort gesendet; diese Property begrenzt die HTTP-Antwortgröße nicht.

Empfehlungen

Szenario

Empfohlene Maßnahme

Standardinstallation, keine bekannten Probleme

Keine Konfiguration vornehmen.

Via Bridge (Standard) – 2-MB-Limit wird erreicht

-Dde.lobster.remoteJdbc.fetchSize=200 in ./bin/bridge.json setzen.

Via Bridge (Standard) – schmale Zeilen, viele Roundtrips

-Dde.lobster.remoteJdbc.fetchSize in ./bin/bridge.json erhöhen (z. B. 1000–2000), um den Durchsatz zu verbessern.

Via Bridge (Standard) – Oracle mit vielen DB-Roundtrips

-Dde.lobster.remoteJdbc.fetchSize=500 in ./bin/bridge.json setzen (erhöht den Cursor-Prefetch; 2-MB-Grenze beachten).

Via Bridge (Standard) – PostgreSQL / MySQL mit großen Ergebnismengen

Fetch-Size-Tuning schützt den Bridge-Heap nicht (autocommit puffert alle Zeilen). Stattdessen Abfragen filtern oder Ergebnismengen begrenzen.

Via Bridge (Legacy) – Oracle mit vielen DB-Roundtrips

-Dde.lobster.tunnel.fetchSize=500 in ./bin/bridge.json setzen.

Via Bridge (Legacy) – PostgreSQL / MySQL

Fetch-Size-Tuning hat keine Wirkung; alle Zeilen werden gepuffert.