Blog

FIS-SST

Hypersistence Optimizer – Kann die Optimierung der Datenzugriffsschicht einfach sein?

Hinter den meisten Anwendungen und Websites befindet sich eine Datenquelle (z. B. eine Datenbank oder andere Dateien), in der alle Arten von Informationen gespeichert werden, die für das ordnungsgemäße Funktionieren des Systems erforderlich sind. Somit ist die Kommunikation der Anwendung mit der Datenquelle ein Schlüsselelement des Systems. Für diese Kommunikation ist die Datenzugriffsschicht verantwortlich.

In der Java-Welt ist die objektrelationale Abbildung eine beliebte Methode zur Implementierung dieser Schicht. Die objektrelationale Abbildung besteht darin, die objektorientierte Architektur des Systems in einer relationalen Datenbank wiederzugeben. Das beliebteste Framework für die objektrelationale Abbildung ist Hibernate, eine Implementierung des JPA-Standards. Hibernate ist ein complexes und leistungsstarkes Tool und daher nicht einfach zu benutzen. Während der Konfiguration und Implementierung können viele Fehler gemacht werden, die sich erheblich negativ auf die Leistung des gebauten Systems auswirken können. Das Finden von Fehlern und die anschließende Optimierung können sehr zeitaufwändig sein. Abhilfe schafft bei diesem Problem der Hypersistence Optimizer.

Imagine having a tool that can automatically detect if you are using JPA and Hibernate properly.” – Hypersistence Optimizer


Hypersistence Optimizer – Was ist das?

Konfiguration von Hibernate, die Entitätszuordnung, Datenbankabfragen und den Persistance Context. Basierend auf der Analyse erhalten wir einen detaillierten Bericht über die in der Anwendung gefundenen Probleme. Ein solcher Bericht enthält unter anderem Informationen über den Schweregrad des gefundenen Problems, seinen Lokalisation, eine kurze Beschreibung des Problems und einen Link zu einer detaillierteren Erläuterung mit Tipps und Beispielen. Das Tool wurde von Hypersistence erstellt und wird ständig weiterentwickelt. Derzeit kann das Tool über 50 verschiedene Arten von Fehlern erkennen. Den Hypersistence Optimizer gibt es in zwei Versionen: Der Voll -und Testversion. Die Testversion ist kostenlos, aber im Vergleich zur Vollversion sehr begrenzt. Die Testversion erfasst nur die Art und die Menge der Fehler und gibt nicht an, wo diese Fehler auftreten und wie mit ihnen umgegangen werden soll. Bevor Sie die Vollversion kaufen, sollten Sie anhand der Testversion prüfen, ob die erstellte Anwendung Fehler enthält.

Die ersten Schritte

Der Installationsvorgang besteht aus wenigen einfachen Schritten. Stellen Sie vor der Installation sicher, dass Maven auf dem Computer installiert ist, der für die Installation des Tools erforderlich ist. Führen Sie nach dem Herunterladen und Entpacken des Archivs die Batchdatei „maven-install“ aus, die sich im extrahierten Ordner befindet. Hypersistence Optimizer wird dem Maven-Repository hinzugefügt. Der nächste Schritt, ist das Hinzufügen von der Abhängigkeit in die pom.xml Datei im Projekt: 

Nach diesem Schritt ist das Tool einsatzbereit. Die Analyse wird auf der Ebene der Unit-Test ausgeführt. Erstellen Sie einen Test und initialisieren Sie den Optimizer. Es kann so aussehen: 

Wie wir sehen können, ist die Verwendung von Hypersistence Optimizer sehr einfach. Während der Initialisierung sollte nur der EntityManager angegeben werden, von dem das Tool die für die Analyse erforderlichen Metadaten abruft. Dies ist natürlich die grundlegendste Konfiguration. Die Konfigurationsoptionen sind umfangreicher. Sie können unter anderem festlegen, welcher Bereich der Datenzugriffsschicht analysiert werden soll (Konfiguration, Entitätszuordnung oder Datenbankabfragen), welche Ereignisse (Events) abgefangen werden sollen oder was mit dem erkannten Ereignissen geschehen soll. Jedes Problem das während der Analyse auftritt verursacht ein Ereignis, das sich auf die aktuell überprüfte Regel bezieht. Daher werden alle erkannten Probleme in Form von Ereignissen zurückgegeben, die einer bestimmten Regel und Beschreibung zugeordnet werden können. Standardmäßig analysiert das Tool alle Bereiche und erfasst alle aufgetretenen Ereignisse. Die Autoren geben eine detaillierte Beschreibung der Konfiguration, mit der Sie das Tool an Ihre Bedürfnisse anpassen können. 

Der letzte Schritt besteht darin, die Standardkonfiguration von Hibernates SessionFactory mit den von den Erstellern bereitgestellten Decorator zu verpacken. Dieser Schritt ist erforderlich, wenn Ihre Datenbankabfragen in Echtzeit analysiert werden sollen. Wenn Sie Hibernate 5 verwenden, kopieren Sie einfach die Datei im Ordner ..\configs\META-INF\services in den Ordner ..\ src\ test\resources des aktuellen Projekts. Das auf diese Weise konfigurierte Tool funktioniert in der Testumgebung, ohne Probleme in der Produktionsumgebung zu verursachen. Für ältere Versionen von Hibernate muss man die SessionFactory manuell verpacken. Eine ausführliche Beschreibung finden Sie im mitgelieferten Konfigurationshandbuch. 

Der Optimizer in Action 

Nach dem Ausführen des Unit-Tests, in dem Hypersistence Optimizer konfiguriert wurde, wird ein Bericht in der Konsole angezeigt. Das Tool wurde an einer kleinen Anwendung zur Buchung von Firmenwagen getestet. Der erhaltene Bericht lautet wie folgt: 

Basierend auf den im Bericht enthaltenen Informationen können wir beginnen, die Datenzugriffsschicht zu optimieren. Betrachten Sie beispielsweise den EagerFetchingEvent-Fehler, der als schwerwiegender Fehler eingestuft wird. Die Beziehung zwischen der Reservierung und dem Fahrzeug wurde als many-to-one definiert, es wurde jedoch keine Strategie zum Laden der Fahrzeugsammlung angegeben. 

Bei Verwendung von many-to-one- und one-to-one-Beziehungen ist die Standard-Erfassungsstrategie FetchType.EAGER. Das EAGER Laden bedeutet, dass die Fahrzeugsammlung beim Herunterladen des übergeordneten Elements vollständig heruntergeladen wird, auch wenn wir sie überhaupt nicht benötigen. In diesem Fall wird empfohlen, die Strategie FetchType.LAZY zu verwenden, mit der die Sammlung bei Bedarf heruntergeladen wird. Der Code nach der Optimierung könnte folgendermaßen aussehen: 

Hypersistence Optimizer erkennt potenzielle Bedrohungen in der Datenzugriffsschicht, die Performanceprobleme verursachen können (aber nicht müssen!). Dies sind jedoch nur Richtlinien, die berücksichtigt werden können, um tatsächliche oder potenzielle Probleme zu beseitigen. Spezifische Lösungen hängen von der Komplexität des gebauten Systems ab. Daher sollte jedes Problem einzeln betrachtet werden. Ein Beispiel wäre das EnumTypeStringEvent. In diesem Fall wird empfohlen, Aufzählungstypen in der Datenbank als EnumType.ORDINAL zu speichern. In der getesteten Anwendung werden die Aufzählungstypen als EnumType.STRING gespeichert. Wenn Sie von EnumType.STRING zu EnumType.ORDINAL wechseln, wird Speicherplatz gespart, aber die Lesbarkeit des Codes und die Lesbarkeit der Informationen in der Datenbank nehmen ab. Hier ist es Sache des Programmierers ob er den Code sauber halten oder bisschen Speicherplatz sparen möchte. 

Der zweite Teil des Berichts enthält festgestellte Probleme im Zusammenhang mit den Datenbankabfragen (wird nur angezeigt, wenn Hibernate SessionFactory konfiguriert wurde): 

In der aktuellen Version von Hypersistence Optimizer werden derzeit nur zwei Arten von Ereignissen bei der Datenbankabfrageanalyse erfasst: PaginationWithoutOrderByEvent und PassDistinctThroughEvent. Im Beispiel können wir sehen, dass selbst in einer so einfachen Abfrage „select v from VEHICLES v “ ein Fehler gemacht werden kann. Wenn Sie die Ergebnisse mit setMaxResults einschränken, müssen Sie Ihrer Abfrage die ORDER BY-Klausel hinzufügen. 

Zusammenfassung 

Das enorme Wissen und Engagement des Autors – Vlad Mihalcea als Sprecher der Programmierer für das Hibernate-Projekt, führte zur Schaffung eines großartigen Tools für die automatische Analyse der Datenzugriffsschicht, dem Hypersistence Optimizer. Dies spart Entwicklern viel Zeit und graues Haar, wenn sie nach den Ursachen für eine schlechte Performance der Anwendung suchen. Darüber hinaus können detaillierte Problembeschreibungen und Beispiele als Wissensbasis für jeden Programmierer dienen. 

Autor: Denis Wiesner

Ingenieur, Java-Programmierer mit mehrjähriger Berufserfahrung im Backend und Frontend. Interessen: numerische Methoden, parallele Programmierung, neue Technologien. 

#java #hibernate #jpa #orm #hypersistenceOptimizer #optymalizacja

Kontaktformular

Lukas Schikora

Project & Operations Manager

Bitte zögern Sie nicht, mich telefonisch oder per E-Mail zu kontaktieren

Download

Damit der Download erfolgen kann, geben Sie bitte hier Ihren Namen und Ihre E-Mail Adresse ein.

Unternehmensinformationen herunterladen (PDF)

Damit der Download erfolgen kann, geben Sie bitte hier Ihren Namen und Ihre E-Mail Adresse ein.

Grenzüberschreitendes Unterstützungskonzept

Damit der Download erfolgen kann, geben Sie bitte hier Ihren Namen und Ihre E-Mail Adresse ein