Hibernate ist ein großartiges ORM — bis man sich die SQL-Logs ansieht. 100 Bestellungen = 101 SQL-Abfragen. Das ist das N+1-Problem und die häufigste Ursache für langsame JPA-Anwendungen.
LazyInitializationException¶
Hibernate lädt Assoziationen standardmäßig lazy. Drei Lösungen: Open Session in View (einfach, verletzt aber die Schichtentrennung), DTO-Pattern (unsere Präferenz), expliziter Fetch.
JOIN FETCH¶
JPQL mit JOIN FETCH lädt die Assoziation in einer einzigen SQL-Abfrage. Ideal für eine einzelne Entity. Bei Listen Vorsicht vor dem kartesischen Produkt.
@BatchSize¶
@BatchSize(size=20) lädt Lazy Collections in Stapeln von 20 statt einzeln. 100 Bestellungen = 5 SQL-Abfragen statt 100.
Second Level Cache¶
Ehcache für Read-mostly-Daten. Query Cache für wiederkehrende Abfragen. Vorsicht bei der Cache-Invalidierung.
Regeln¶
- SQL im Development loggen. 2.
JOIN FETCHfür einzelne Entities verwenden. 3.@BatchSizefür Listen verwenden. 4. Das DTO-Pattern anwenden. 5. Read-mostly-Daten cachen.
Brauchen Sie Hilfe bei der Implementierung?
Unsere Experten helfen Ihnen bei Design, Implementierung und Betrieb. Von der Architektur bis zur Produktion.
Kontaktieren Sie uns