Hibernate Fragen zu Lazy Loading

Dieses Thema Hibernate - Fragen zu Lazy Loading im Forum "Data Tier" wurde erstellt von ozan, 27. Sep. 2015.

Thema: Fragen zu Lazy Loading Hallo Community, ich habe bald ein Vorstellungsgespräch (neues Kapitel in meinem Leben :-) ) und habe eine kleine...

  1. Hallo Community,

    ich habe bald ein Vorstellungsgespräch (neues Kapitel in meinem Leben :) ) und habe eine kleine Aufgabe zur Vorbereitung bekommen, die ich in 3-5 Folien (10 Minuten) präsentieren muss. Dabei muss ich einen Überblick zu Hibernate ORM geben. Danach soll ich im Detail erklären, wie der Lazy Loading Mechanismus in Hibernate funktioniert, für den ich die Vor- und Nachteile aufzählen muss. Dazu soll ich dann aber auch erzählen, was das Problem bei Lazy Loading ist. Zum Abschluss soll ich dann mind. 2 verschiedene Lösungsansätze zur Vermeidung dieses Problems aufzählen.

    Ich habe mich natürlich über Hibernate und Lazy Loading etwas schlau gemacht:
    Hibernate ist ein Persistenzframework für Java. Lazy Loading lädt für den Anfang nur die relevanten Objekte, später benötigte Dateien werden einfach nachgeladen.

    Vorteile: Performanz, was noch?
    Nachteile: Gibt es sicherlich, aber welche? Was genau passiert, wenn man die Kindobjekte von der Elternklasse nachlädt? Wird über die Kindobekte iteriert und alles wird nachgeladen? Wie kann ich mir das vorstellen?

    Was genau ist das Problem bei Lazy Loading? Ich habe noch nie damit gearbeitet und kann mir nicht vorstellen, welches explizite Problem auftreten kann.

    Kennt Ihr mind. 2 Alternativen zur Vermeidung des Problems?

    Ich freue mich über Eure Antworten!

    Liebe Grüße
    Ozan
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. stg
    stg
    Man will vermutlich auf das "N+1"-Problem zu sprechen kommen. Wenn du danach bei Google suchst, solltest du genügend Antworten auf all deine Fragen finden.
     
  4. Servus stg,

    Danke für Deine Antwort. Habe das eben auch rausgefunden, dass es dieses Problem gibt. Lese gerade darüber.
    Zu den Vorteilen fällt mir sowas ein (auch nach Recherche):
    • Weniger Speicherverbrauch, da nur die nötigsten Daten abgerufen werden
    • Weniger Anlaufzeit der Anwendung
    • Unnötige SQL-Anweisungen werden vermieden
    Ein Nachteil fällt mir bis jetzt immer noch nicht ein :/ Vielleicht, dass dann der Code komplexer wird? Kann das sein?
     
  5. stg
    stg
    Nö, der Code wird nicht komplexer. Der Zugriff auf die Daten erfolgt vollkommen transparent. Du bekommst im Code gar nicht mit, ob du auf ein Objekt direkt zugreifst oder aber nur auf ein Proxy, welches nachträglich initialisiert wird.

    Wenn du Daten nicht brauchst, ist es natürlich von Vorteil, wenn diese gar nicht erst geladen werden. Wenn du allerdings auf diese Daten zugreifen willst, dann wäre es doch sinnvoller, diese direkt mitzuladen?!
    Statt Vor- und Nachteile aufzuzählen (was mMn nicht wirklich sinnvoll ist) würde ich an deiner Stelle eher gegenüberstellen, was die Unterschiede zwischen Eager- und Lazy-Loading ausmacht. Wann nutzt man das eine und wann das andere? Welche Folgen hat die Wahl des FetchTypes jeweils?
     
  6. Ein Proxy? Wie kann ich das verstehen? Was geschieht denn bei Lazy Loading im Detail? Wird dabei erst die nötige Klasse geladen und im Hintergrund noch was offen gelassen (joins?), um bei Bedarf direkt darauf zugreifen zu können? Kannst Du mir sagen, was genau im Detail passiert?

    Eager Loading würde mMn Sinn bei kleineren Anwendungen mit wenigen Abhängigkeiten Sinn machen. Lazy Loading eben bei größeren, wo nicht alle abhängigen Daten, unter Umständen mehrere Tausend Zeilen in der Datenbank, gebraucht werden.

    Danke Dir..
     
  7. Joose
    Joose Mitarbeiter
    Ein Nachteil: Ein Objekt wird am Anfang geladen (nur die benötigten Daten) ... sollen dann viele Daten nachgeladen werden, so kann es je nach Daten natürlich zu kurzen Wartezeiten kommen.
     
  8. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!