Blog

EJAPP Top 10 Countdown: #1 - Falsche Datenbanknutzung

Vincent Partington

Aktualisiert Oktober 23, 2025
5 Minuten

Ich werde Sie nicht länger auf die Folter spannen. ;-) Es ist Zeit für die Nummer eins des EJAPP Top 10 Countdowns! Etwas unerwartet für eine Top 10 der Performance-Probleme von Enterprise Java-Anwendungen ist die falsche Verwendung von Datenbanken die Nummer 1.

In vielen Enterprise Java-Projekten wird die Datenbank wie ein einfacher Biteimer behandelt und der DBA nur als derjenige, der die SQL-Anweisungen auf den Produktionsrechnern ausführt. Diese Geringschätzung der Datenbank und ihrer Experten führt zu schlecht funktionierenden Anwendungen wie z.B.:

  • Eine Datenbank, die eine Tabelle mit zwei Spalten enthält: KEY und VALUE. Java-Objekte wurden hier gespeichert, indem Eigenschaftsnamen in der Spalte KEY und ihre Werte in der Spalte VALUE gespeichert wurden. Die Motivation für dieses Design war die Erweiterbarkeit: Es waren keine Änderungen an der Datenbank erforderlich, wenn sich die Java-Objekte änderten. Natürlich gab es eine Menge Code, der sich mit der Konvertierung von Java-Objekten und ihren Datentypen (int, boolean usw.) in VARCHARs befasste, der (a) nicht funktionierte, (b) bei jeder Änderung eines Java-Objekts geändert werden musste und (c) es unmöglich machte, geeignete Indizes zu erstellen.
  • Eine Front-End-Anwendung, die ihre Daten aus Ansichten las. Die Tabellen hinter diesen Ansichten hatten Indizes, aber nicht auf den Spalten, die von den Abfragen für die Ansichten verwendet wurden!

Anstatt mit dem Finger aufeinander zu zeigen, sollten Java-Entwickler und DBAs in allen Phasen eines Projekts zusammenarbeiten, um sicherzustellen, dass die Datenbank und der Java-Anwendungsserver die für die Anwendung erforderliche Leistung erbringen. Entwurf

  • Überlegen Sie sich, welche Daten Sie tatsächlich persistieren müssen und wann und für wen Sie sie persistieren wollen. Werfen Sie auch einen Blick auf den EJAPP Top 10-Eintrag über unsachgemäße Zwischenspeicherung, um zu erfahren, was Sie beim Umgang mit Caches tun (und was Sie nicht tun sollten!).
  • Modellieren Sie Ihre Daten. Greifen Sie nicht auf das im obigen Beispiel erwähnte Schlüssel/Wertpaar-Design zurück.
  • Normalisieren Sie Ihre Datenbank mindestens auf die dritte Normalform. Alles, was darüber hinausgeht, ist wahrscheinlich nicht der Mühe wert.
  • Wählen Sie Ihren Primärschlüssel mit Bedacht. Ihre Wahl wird für eine lange Zeit Bestand haben.
  • Informieren Sie sich über die Datentypen, die Ihre Datenbank bietet, und deren Auswirkungen auf die Leistung(Oracle).
  • Verwenden Sie die Datenbank für das, was sie am besten kann: Prüfung der referentiellen Integrität, Validierung, Manipulation, Auswahl und Sortierung großer Datensätze. Machen Sie diese Dinge nicht in Ihrem Java-Code. Schreiben Sie zum Beispiel nicht zwei Abfragen und führen Sie die Ergebnisse dann in Java zusammen: Verwenden Sie eine Verknüpfung. Das scheint offensichtlich zu sein, aber das Zusammenführen in Java kommt immer noch häufig vor. Denken Sie an das EJB n+1 Problem!
  • Schließlich sollten Sie bei der Bearbeitung großer Datensätze die Verwendung von gespeicherten Prozeduren in Betracht ziehen, anstatt die Daten abzurufen, sie in Java zu bearbeiten und dann alles wieder zurückzuschreiben.

Implementierung

  • Erstellen Sie bei Bedarf Indizes. Zumindest für die Primärschlüsselspalten (die meisten Datenbanken tun dies automatisch), aber denken Sie auch daran, Indizes für Fremdschlüsselspalten zu erstellen, um Joins zu beschleunigen. Übertreiben Sie es nicht, sonst verbringt die Datenbank viel Zeit damit, die Indizes zu aktualisieren. Und Sie werden viel Zeit mit der Verwaltung der Indizes verbringen.
  • Rufen Sie nicht mit jeder Abfrage(SELECT * FROM ...) alle Spalten ab, sondern nur die, die Sie benötigen. Sie können dies auch in HQL und EJBQL tun.
  • Informieren Sie sich darüber, wie Ihre Datenbank Transaktionen und Gleichzeitigkeit handhabt (Oracle, DB2, MySQL) und bestimmen Sie auf dieser Grundlage die Transaktionsattribute und Isolationsebenen, die Sie verwenden werden. Weitere Informationen finden Sie im EJAPP Top 10 Eintrag über falsch implementierte Gleichzeitigkeit.
  • Scheuen Sie sich nicht, die Funktionen der von Ihnen verwendeten Datenbank zu nutzen. Die Wahl der Datenbank ist in der Regel noch starrer als die Wahl des Anwendungsservers. Es lohnt sich also, alle Tricks zu lernen, die Ihre Datenbank bietet, und sie zu nutzen, um maximale Leistung zu erzielen.

Deployment

  • Stimmen Sie die Datenbank auf die Anwendung ab, so wie auch der Anwendungsserver abgestimmt werden muss. Lesen Sie die Anleitungen zur Leistungsoptimierung für Oracle, DB2 und MySQL. Das Buch Oracle Performance Tuning von O'Reilly hat mir sehr gut gefallen, aber leider ist die letzte Ausgabe aus dem Jahr 1997. Dennoch ist es eine inspirierende Lektüre, wenn Sie einfach nur lesen wollen, wie diese Profis an Performance-Probleme und ihre Projekte im Allgemeinen herangehen.
  • Untersuchen Sie insbesondere den Abfrageausführungsplan (auch bekannt als Explain-Plan) für die Abfragen, die Ihre Anwendung verwendet. Prüfen Sie die Kosten für alle vollständigen Tabellenscans und fügen Sie bei Bedarf Indizes hinzu. Oracle, DB2 und MySQL bieten alle Tools für diese Aufgabe.
  • Lernen Sie, wie der Abfrageoptimierer Ihrer Datenbank (Oracle, DB2, MySQL) arbeitet. Oracle 9i führt Abfragen beispielsweise VIEL schneller aus, wenn die Tabellen sowohl in der FROM- als auch in der WHERE-Klausel von groß nach klein geordnet sind. Wenn Sie die Reihenfolge der Tabellen in den FROM- und WHERE-Klauseln ändern, kann die Ausführungszeit einer Abfrage von über 60 Sekunden auf weniger als 1 Sekunde sinken.
  • Erstellen Sie ein Profil Ihrer JDBC-Aufrufe. Das Open-Source-Tool P6Spy gibt Ihnen Einblick in die Leistung Ihrer JDBC-Aufrufe. Das kommerzielle Tool Quest Performasure kann das und noch viel mehr.

Zusammenfassend lässt sich sagen, dass Enterprise Java-Entwickler ihre Datenbank verstehen und mit ihrem DBA zusammenarbeiten müssen, um die maximale Leistung aus ihrer Anwendung herauszuholen! Vielen Dank an Barre Dijkstra und Wouter van Reeven für ihre wertvollen Beiträge zu diesem Blog.

Mehr aus dieser Serie

Verfasst von

Vincent Partington

Contact

Let’s discuss how we can support your journey.