Große Anzahl von Hibernate Abfragen beschleunigen

Hat man eine große Anzahl von Abfragen in Hibernate, z.B. für Auswertungen, sinkt oft die Geschwindigkeit. Eine Möglichkeit, die Abfragen zu beschleunigen, ist es zwischendurch den 1st-Level-Cache zu leeren.

Wichtig dabei ist, dass man nach dem Leeren zwar noch auf die bereits gelesenen Entities zugreifen kann, aber nicht auf Lazy-Loaded properties. Außerdem werden ev. Änderungen an den Entities nicht in die Datenbank persistiert.

Deshalb sollte man das nur in bestimmten Situationen anwenden, z.B. wenn man für Auswertungen viele Daten auslesen oder aggregieren muss.

Um den 1st-Level-Cache zu leeren, benötigt man die SessionFactory, welche man z.B. mit Autowired (Spring) einbinden kann:

@Autowired private SessionFactory sessionFactory;

Das Leeren erfolgt mit:

this.sessionFactory.getCurrentSession().clear();

Über den 1st-Level-Cache von Hibernate:

Der First-Level-Cache oder auch Persistenz-Context genannt, ist die erste Caching-Schicht in Hibernate. Er wird innerhalb einer Transaktion befüllt und anschließend wieder geleert. Der 1st-Level-Cache speichert alle Objekte, die von einem Query innerhalb einer Transaktion geladen wurden. Änderungen an den Objekten werden normalerweise solange wie möglich im Cache behalten und erst bei beenden der Transaktion in die Datenbank geschrieben. Versucht man ein Objekt zu laden, welches schon im 1st-Level-Cache existiert, wird dieses verwendet und ein Datenbank-Zugriff vermieden.