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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert