Wann Lazy Loading / Eager Loading im Ruhezustand verwenden?

7

Ich glaube, dass es nur zwei Möglichkeiten gibt, Objekte mit Hibernate zu laden: Lazy Loading und Eager Loading. Lazy Loading hat seine eigenen Vorteile, es lädt nicht viele Objekte, sondern nur wenn Sie sie brauchen. Ich habe auch gelernt, dass, wenn Sie zwingen wollen, alle Kinder für ein Objekt zu laden, können Sie einfach das parent.getChildren().size() aufrufen. Nehmen wir an, wir haben folgende Objekte

%Vor%

Nehmen wir an, wir haben Kunden, die Bestellungen in unserem System haben und es könnte mehr als eins oder sogar null sein. Also meine Frage ist, ist es nicht besser, in diesem Fall immer eifrig zu laden? Wir benötigen die Größe oder einige Informationen für die Bestellung in Bezug auf den Kunden. Was ist der Vorteil der Verwendung von Lazy Loading in dieser Situation, gibt es Vorteile?

Ich versuche zu verstehen, wo ich lazy loading verwenden kann und wo ich eifriges Laden verwenden kann. Ich schätze Ihre Erkenntnisse sehr.

    
sheidaei 24.09.2012, 16:47
quelle

2 Antworten

20
  

Ich versuche zu verstehen, wo ich lazy loading verwenden kann und wo ich sie verwenden kann   eifrig laden, schätzen Sie Ihre Einsicht.

Hier sind ein paar Gedanken:

1) Wenn du immer etwas verwenden willst (sicher), kannst du es gerne laden.
2) Im Zusammenhang mit 1, wenn Sie fast nie etwas verwenden, laden Sie es faul 3) Lazy Loading ist bei größeren Sammlungen eher nützlich 4) Das mühsame Laden von Dingen wird sessionbezogene Fehler reduzieren, bei den potenziellen Kosten eines Leistungseinbruchs.
5) Bei komplizierten Datenmodellen und / oder großen Datenbanken sehen Sie, wie Ihre App unter Last Ihre Strategien anpasst 6) Es ist schwierig, es beim ersten Mal richtig zu machen. Tue, was sich richtig anfühlt, und habe keine Angst, wenn nötig zu ändern.
7) Bei großen Datasets werden Sie vermutlich sowieso benutzerdefinierte hql / Queries schreiben, wo die Standardzuordnungen überschrieben werden können, also ist faul vs eifrig nicht so wichtig.

Wenn Sie # 6 glauben, dann bleiben Sie nicht stecken und versuchen Sie, zu weit voraus zu planen, und ändern Sie es, wenn Sie müssen.

WRT Ihr spezifisches Beispiel, würde ich wahrscheinlich eine Reihe von Abfragen schreiben, um auf die Daten zuzugreifen (natürlich durch entsprechende Geschäftsanforderungen)

1) Eine Abfrage, die den Kunden lädt und die Bestellungen in der db (also lazy loading) belässt, die ich aufrufen würde, wenn ich Kundendaten abrufen möchte 2) Eine Abfrage, die den Kunden und alle Bestellinformationen lädt, für Fälle, in denen ich es brauche. In diesem Fall ignoriere ich das Standard-Mapping.

Wenn diese beiden Abfragen vorhanden sind, habe ich in meinen Service-Layern die Werkzeuge, die ich brauche, um das Richtige zu tun, je nach dem Kontext der Situation.

    
hvgotcodes 24.09.2012, 16:56
quelle
5

Dieser Link beantwortet Ihre Frage perfekt.

LAZY loading wird in Fällen verwendet, in denen die Entitätsgröße sehr groß ist und nicht jedes Mal abgerufen werden muss

EAGER sollte mit einer korrekten Analyse verwendet werden, da es die Beziehung jedes Mal lädt, wenn die Haupteinheit geladen wird.

Wenn also eine Beziehung für die Berechnung von Geschäftslogik absolut notwendig ist, sollten Sie daran denken, EAGER loading zu verwenden; LAZY loading wird den meisten Fällen gerecht und bietet weniger Leistungsprobleme.

    
SiB 24.09.2012 16:55
quelle

Tags und Links