Verwenden Sie den OpenEntityManagerInViewFilter von Spring
Obwohl viele Beiträge zum Thema OpenSession / EntityManagerInViewFilter von Spring verfasst wurden, konnte ich keine finden, in denen die Fehler erwähnt werden. Nach meinem Verständnis und unter der Annahme einer typischen geschichteten Webanwendungsarchitektur mit einer @ Transactional Service-Schicht funktioniert der Filter wie folgt:
Der Filter fängt eine Servlet-Anforderung abDer Filter öffnet einen EntityManager und bindet ihn an den aktuellen ThreadWeb Controller wird aufgerufenDer Web-Controller ruft den Dienst aufTransaction Interceptor startet eine neue Transaktion, ruft den threadgebundenen EntityManager ab und bindet ihn an die TransaktionDer Dienst wird aufgerufen, erledigt einige Aufgaben mit EntityManager und kehrt dann zurückTransaction Interceptor löscht den EntityManager und schreibt die Transaktion festDer Web-Controller bereitet die Ansicht vor und kehrt dann zurückAnsicht wird gebautFilter schließt den EntityManager und trennt ihn vom aktuellen ThreadIn den Schritten 8 und 9 werden Objekte, die vom EntityManager des Threads geladen wurden, weiterhin verwaltet. Wenn in diesen Schritten verzögerte Verknüpfungen berührt werden, werden sie folglich mit dem noch geöffneten EntityManager aus der Datenbank geladen. Soweit ich weiß, erfordert jeder solche Zugriff, dass die Datenbank eine Transaktion öffnet. Das Transaktionsmanagement von Spring wird sich dessen nicht bewusst sein, daher nenne ich es "implizite Transaktion".
Ich sehe 2 Probleme damit:
Das Laden mehrerer verzögerter Zuordnungen führt zu mehreren Datenbanktransaktionen, was sich möglicherweise negativ auf die Leistung auswirktDas Stammobjekt und seine verzögerten Zuordnungen werden in verschiedene Datenbanktransaktionen geladen, sodass die Daten möglicherweise veraltet sind (z. B. Stamm von Thread 1 geladen, Stammzuordnungen von Thread 2 aktualisiert, Stammzuordnungen von Thread 1 geladen).Einerseits scheinen diese beiden Probleme genug zu sein, um die Verwendung dieses Filters abzulehnen (Leistungseinbußen, Dateninkonsistenz). Andererseits ist diese Lösung sehr praktisch, vermeidet das Schreiben mehrerer Codezeilen, Problem 1 ist möglicherweise nicht so auffällig und Problem 2 ist möglicherweise reine Paranoia.
Was denkst du?
Vielen Dank!