Hibernate Performance Boost aus der Praxis

In der Javaentwicklung geht spätestens seit Spring Data kaum ein Weg an Hibernate vorbei. Mit Hibernate sind Datenbankzugriffe sehr einfach. Allerdings kauft man sich – wie mit allen OR-Mappern – einen großen Performancenachteil ein. Zusätzlich bietet Hibernate viele Fallen, die in vielen Artikeln besprochen werden.

Eine Falle hat nicht direkt mit Hibernate zu tun, in der Praxis sieht man diesen Performanceverlust immer wieder. Um dies anschaulicher zu machen haben wir ein einfaches Datenmodell mit einem User und einer UserRelation. Ein User kann mehrere dynamische UserRelations haben. Der Zugriff erfolgt über einen Foreign Key. Der REST Call mit Spring Data Repositories sieht wie folgt aus:

    @GetMapping("{userid}")
    public UserRelation getUserRelation(@PathVariable("userid") UUID userID) {
        User user = userRepository.getById(userID);
        return userRelationRepository.getByUser(user);
    }

Wo ist das Problem

Denken wir im klassischen SQL würden wir folgenden Zugriff machen.

SELECT * FROM UserRelation WHERE userId = :userID

Mit Hibernate machen wir aber mindestens zwei Aufrufe. Wir holen uns erst den User und erst mit diesem Ergebnis holen wir uns die UserRelation. Das HQL Statement im Repository sieht dann folgendermaßen aus.

SELECT u FROM UserRelation u WHERE u.user = :user

Die Lösung

Die Lösung ist ein versteckter aber sehr einfacherer Trick. Der Zugriff auf die UserRelation soll genauso, wie im SQL erfolgen. Hierzu muss lediglich der Zugriff über die UUID erfolgen. Hierzu muss man die Entität nicht verändern und man kann weiterhin Lazy auf die User Entität zugreifen. Zusätzlich ist der Zugriff beim REST Call einfacher und es muss lediglich ein Funktionscall erfolgen.

SELECT u FROM UserRelation u WHERE u.user.id = :userId

BIGA SOFTWARE
Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzererfahrung bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst, und hilft unserem Team zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.