Markus Seidl Freelancer

Große Datenmengen lassen sich innerhalb der Applikation mit einfachen Bordmitteln verarbeiten, ganz ohne zusätzliche Bibliotheken oder Abhängigkeiten.

Daten in der Datenbank, Logik in der Businessschicht: Das Konzept klingt einfach, ist jedoch in der Praxis nicht immer einfach umzusetzen. Sowohl Datenbank als auch der Applikationsserver unterliegen Beschränkungen, und für einige Anwendungsfälle ist es bequemer, diese im eigentlich falschen System umzusetzen. Das ist nicht der Weisheit letzter Schluss, und mit etwas Know-how lässt sich effizient in der Applikation jonglieren.

Wie haben es Datenbanken geschafft, den wichtigen Businesscode aus der Anwendung in ihre proprietäre Umgebung zu ziehen? Datenbanken bieten spezielle Sprachen für die Verarbeitung von Daten an, z. B. PL/SQL oder T-SQL. Diese versprechen dem Benutzer einen effizienten Zugriff auf die Datenbank und einen erweiterten Satz an Features, der über SQL nur schwer zu erreichen ist. Für erfahrene Java-Entwickler sind diese Sprachen oft ein Rückschritt. Ihnen fehlen die gewohnte Testbarkeit und der gewohnte Sprachumfang, und alle Datenbanksprachen bringen ihre zusätzlichen Eigentümlichkeiten mit.

Ein weiteres Problem ist die Überlastung der Datenbankserver. Die Datenbanken werden von erfahrenen Datenbankadministratoren überwacht, und die Datenbank stellt viele Auswertungen zur Performanceanalyse zur Verfügung. Eine Abteilung im Unternehmen beschäftigt sich mit der Analyse von länger laufenden SQL-Statements und liefert diese Analysen dem Entwickler zurück. Dieser ist nun im Zugzwang und findet sich zwischen zwei Fronten wieder: Einerseits sind die fachlichen Anforderungen zu erfüllen, andererseits muss er den Anforderungen der Datenbankbetreiber gerecht werden. Im Gegensatz dazu sind Laufzeitprobleme innerhalb einer Applikation dem Java-Entwickler geläufig. Liveanalysen, Logmeldungen und andere Tools helfen dem Entwickler, diese Probleme einfach zu erkennen und zu lösen. Die Performancemeldungen lassen sich einfach bis zur jeweiligen Java-Codezeile identifizieren, im Gegensatz zu ihren PL/SQL- oder T-SQL-Varianten.

Große Datenmengen lassen sich innerhalb der Applikation mit einfachen Bordmitteln verarbeiten, ganz ohne zusätzliche Bibliotheken oder Abhängigkeiten. Die nachfolgenden Methoden eignen sich für mittlere bis größere Datenmengen, die noch nicht zwingend in einem Rechencluster verarbeitet werden müssen.

Der Iterator legt den Grundstein

Der Datenverarbeitungscode im Applikationsserver benötigt ein klein wenig Vorbereitung: eine spezielle Implementierung des Iterator-Interface. Die Implementierung soll dabei über die Ergebnisse einer Query iterieren können. Der Clou dabei ist, dass der Iterator selbstständig über die komplette Datenmenge paged und das Handling damit vereinfacht. Wir beginnen mit der Implementierung des Iterator-Interface. Der interessante Part liegt in der Funktion next() (Listing 1), da hier automatisch der nächste Block geladen werden soll. Mit firstResult() und maxResult() wird aus einer übergebenen Query der jeweilige Block aus der Datenbank abgefragt. Die Query muss eine stabile Sortierung gewährleisten. Dazu wird nach den fachlichen Kriterien ein eindeutiges Sortierkriterium angefügt. Hierfür eignet sich der Primärschlüssel oder die ROWID. Steht keine stabile Sortierung zur Verfügung, kann die Datenbank in mehreren Batches die gleichen Datensätze zurückliefern oder Datensätze ganz überspringen. Das kann, je nach Anwendungsfall, ein Problem sein.

Die BLOCK_SIZE ist eine magische Zahl, die angibt, wie viele Datensätze aus der Datenbank in einem Rutsch geliefert werden. Es empfiehlt sich durchaus, hier mit unterschiedlichen Werten im Produktivsystem zu experimentieren. Verschiedene Datenbanksysteme, Speicherverfügbarkeit, Puffergrößen sowie Netzwerklaufzeit können den Sweet Spot für die Batch-Größe verschieben. Der Wert 10 000 hat sich bisher als guter Startwert erwiesen.

Den vollständigen Artikel lesen Sie in der Ausgabe:

Java Magazin 9.17 - "Java EE 8"

Alle Infos zum Heft
579807479Daten zwischen Businessschicht und Datenbank jonglieren
X
- Gib Deinen Standort ein -
- or -