Lazy Loading
Lazy Loading, wörtlich „faules Laden“ (treffender etwa: „müßiges Laden“), bezeichnet in der Softwareentwicklung ein Entwurfsmuster, bei dem Datenobjekte grundsätzlich Werte oder andere, abhängige Objekte bereitstellen, diese aber erst bei einer konkreten Anfrage aus der Datenquelle holen.[1]
Das Gegenteil wird als „eager loading“ bezeichnet; hierbei werden möglichst effizient sofort alle absehbar benötigten Daten geholt.
Gründe für die Anwendung
Grund für die Anwendung kann sein, dass es zeit- oder ressourcenaufwendig ist, den Inhalt zu holen, etwa bei einer Datenbankabfrage, einem Webservice-Request oder einer komplexen Bearbeitung, und es anfangs noch nicht klar ist, welche Daten tatsächlich benötigt werden. Bei starker Vernetzung von Datenstrukturen würden außerdem sonst u. U. umfangreiche Kaskaden immer weiterer Ladevorgänge ausgelöst.
Implementierungsmöglichkeiten
- Verzögerte Initialisierung (lazy initialization)
- meist mit Eigenschaften (properties) im Programmcode realisiert; diese sind, von außen betrachtet, Werte oder Objekte, wobei erst bei deren Abfrage oder Veränderung der initialisierende Programmcode ausgeführt wird. So führt dann der Abruf eines erwarteten Inhalts einer Eigenschaft zur Ausführung dieses Initialisierungscodes, der diesen Inhalt tatsächlich beschafft, z. B. aus einer Datenbank.
- Virtueller Proxy
- ein nach außen gleiches Objekt mit gleicher Schnittstelle steht an Stelle des echten Objekts; bei der ersten Verwendung beschafft es die nötigen Daten und stellt sie bereit, bzw. wird ersetzt durch ein vollwertiges Objekt.
- Geist (Ghost)
- Spezialform eines Proxy, die einzelne, bekannte Eigenschaften des zu holenden Datenobjekts von Anfang an beinhaltet (z. B. ID-Nummer), so dass er eingeschränkt verwendet werden kann, ohne die echten Daten holen zu müssen.
- Value holder
- ein Hilfsobjekt, das die verzögerte Datenbeschaffung verwaltet und Daten bei Bedarf ausgibt, so dass es z. B. hinter den Wert-Eigenschaften eines Datenobjekts stehen und für dieses im Hintergrund die Werte bereitstellen kann.
Risiken
Lazy Loading ist oft ein Versuch, die Zahl der Datenzugriffe zu minimieren, jedoch meist zu Lasten der Effizienz bei mehreren Zugriffen. Werden sehr viele Werte oder Unterobjekte benötigt und per Lazy Load geholt, indem beispielsweise im Programm der Objektbaum durchlaufen und die Werte und Objekte so initialisiert werden, kommt es zu einer großen Zahl von Einzelabfragen. Viele Datenquellen, wie Datenbanken, sind dafür konzipiert, mit möglichst wenigen Anfragen viele Daten zu bearbeiten und komplette Ergebnisse zurück zu liefern. Werden viele Datensätze statt mit wenigen, beschreibenden Abfragen mit einer Vielzahl von Einzelabfragen ausgelesen, ist das für die Datenquellen und Netzwerkstruktur oft eine erhebliche Belastung. Im Datenbank-Kontext wird daher auch vom SELECT N+1-Problem gesprochen: mit einer (1) Abfrage werden zunächst N Objekte geladen; dann werden für jedes dieser Objekte, also N mal, einzelne Abfragen für abhängige Werte und Objekte abgerufen.
Siehe auch
Einzelnachweise
- Martin Fowler, Patterns of Enterprise Application Architecture, Addison-Wesley, 2003, S. 200–214, ISBN 0-321-12742-0.