Lazy loading: Porovnání verzí
Smazaný obsah Přidaný obsah
Bez shrnutí editace značka: možný vandalismus |
Verze 13542037 uživatele 78.108.155.2 (diskuse) zrušena |
||
Řádek 1:
'''Lazy Loading''' je [[návrhový vzor]] pro strategii načítání objektů z [[databáze]] až v momentě, kdy jsou opravdu potřeba. Tato strategie je velice důležitá při zlepšování
Je však zbytečné tento postup aplikovat, pokud data, která potřebujeme jsou všechny v jedné [[Tabulka_(databáze)|tabulce databáze]]. Jinými slovy je Lazy Loading užitečný tehdy, když na nahrání celé entity se všemi daty (i s těmi napojenými na entitu) je potřeba více dotazů do několika tabulek databáze najednou.
== Druhy Lazy Loadingu ==
Existují 4 základní postupy [[implementace]] této strategie, jsou to Lazy initialization, Virtuální proxy, Value holder a Ghost.
Řádek 13 ⟶ 16:
}
}
}
</source>
Z ukázky je patrné, jak Lazy initialization funguje. Pokud se aplikace dotáže na proměnnou products, je zavolána přístupová metoda getProducts(). Zde je kontrola na hodnotu null. Pokud je daný objekt null, znamená to, že nebyla inicializována a je potřeba ji načíst z databáze.
=== Virtuální proxy ===
Virtuální proxy je implementace Lazy Loadingu nahrazením entity jejím virtuálním dvojníkem, který prakticky neobsahuje žádné data, ale implementuje stejné rozhraní jako originální objekt. Načítání a vracení požadovaných dat je prováděno až v momentě, kdy je zavolána patřičná metoda proxy objektu. Důležité je poznamenat, že virtuální je v podstatě originální objekt, neboť objekt, který ten originální obaluje bude v aplikaci vždy dostupný, kdežto obalený (originální) objekt nemusí být vůbec inicializován a tudíž dostupný. Velikou výhodou této implementace je možnost existence více proxy objektů pro jeden reálný objekt. Nevýhodou je však nutnost vytváření proxy objektů pro každý objekt, pro který chceme zavést Lazy loading.
==== Ukázka virtuální proxy ====
<source lang="java">
Class VirtualList implements List {
private List source;
private VirtualListLoader loader;
public VirtualList(VirtualListLoader loader) {
this.loader = loader;
}
private List getSource() {
if (source == null) source = loader.load();
return source;
}
}
public int size() {
return getSource().size();
}
}
</source>
V ukázce je proměnná source originálním objektem, který obaluje třída VirtualList. Pokud v aplikaci potřebujeme znát velikost kolekce List (proměnná source), zavoláme metodu getSize(), která nejdříve zkontroluje, zda je proměnná source inizializována a pokud tomu tak není, načte ji z databáze. Dále je pak zavolána metoda size() již na originálním objektu. Zde je patrné, že je potřeba implementovat všechny metody originálního objektu, které chceme mít přístupné.
=== Value holder ===
|