© StonePictures/Shutterstock.com
Kolumne: EnterpriseTales

Kolumne: EnterpriseTales


Für Reactive Programming gibt es in Java mittlerweile viele Frameworks. Aber wie greife ich dann auf eine relationale Datenbank zu? Der Java-Standard zum Zugriff auf relationale Datenbanken, JDBC, unterstützt bisher nur blockierende Aufrufe. Welche Möglichkeiten gibt es aber dann, wenn man ganz auf Reactive Programming setzt?

In vergangenen Kolumnen habe ich bereits mehrfach über Reactive Programming geschrieben; teilweise war ich dabei durchaus kritisch (siehe z. B. [1]). Reactive Programming erhöht den Entwicklungs- und Wartungsaufwand, weil Logging, Testing und Debugging deutlich aufwendiger werden. Die Entscheidung, eine Anwendung reactive zu realisieren, macht also nur dann Sinn, wenn die Performance- und/oder Speicheranforderungen so hoch sind, dass normale imperative oder objektorientierte Programmierung nicht ausreicht. Lediglich dann ist der höhere Entwicklungs- und Wartungsaufwand zu rechtfertigen.

Solche Anforderungen kommen häufig zustande, wenn es darum geht, große Mengen an Daten bereitzustellen oder zu verarbeiten. Bei klassischen Entwicklungsansätzen würden diese Daten zunächst komplett in den Speicher geladen und dann entweder zum Client zurückgegeben oder verarbeitet werden.

Der Teufelskreis aus Speicherbedarf und Kontextwechseln

Werden die Datenmengen zu groß, um sie komplett in den Speicher zu laden, würde man klassischerweise damit beginnen, die Daten häppchenweise (z. B. über Pagination) zu verarbeiten. Dieser Ansatz hat allerdings einen Nachteil: Um die Menge der Daten im Speicher gering zu halten, gibt es viele Round-Trips zur Datenbank. Bei einer relationalen Datenbank und der Verwendung von JDBC (sei es direkt oder über JPA) ist allerdings jeder dieser Round-Trips mit einem blockierenden Warten auf das Ergebnis verbunden. Und jeder dieser blockierenden Aufrufe führt zu einem schwergewichtigen Kontextwechsel im Betriebssystem. Dadurch wird die gesamte Verarbeitung inperformant. Um die Anzahl der Kontextwechsel zu minimieren, müsste die Anzahl der Round-Trips minimiert werden, folglich müsste man größere Chunks verwenden. Das wiederum führt allerdings zu mehr Speicherbedarf. Man befände sich in einem Teufelskreis der Optimierung von Datenzugriffen.

Hier kommt Reactive Programming mit Reactive Streams ins Spiel. Anstatt die Daten Chunk-weise zu laden, können sie (nicht-blockierend) gestreamt werden. Die Datenbank informiert die Anwendung, sobald ein neuer Datensatz geladen wurde, woraufhin die Anwendung diesen verarbeiten kann. Dam...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang