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í vnévýkonu tento[[Aplikační_software|aplikací]] postuppracujících aplikovat,s pokuddatabází. data,V kteráprogramování potřebujemeje jsoučastým všechnyproblémem v jednénahrávání [[Tabulka_Entita_(databázeinformatika)|tabulce databázeentit]]., Jinýmikteré slovyjsou jespojené s velikým množstvím jiných entit a tudíž nahrání takové entity vede k nahrání všech těchto spojených entit, čímž se výkon aplikace razantně snižuje. Lazy Loading užitečnýtoto tehdyřeší řízením dotazů do databáze, které yjsou Loadinguprováděny ==až v momentě, kdy jsou data spojená s nahrávanou entitou opravdu zapotřebí.
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:
}
}
}
} patrné, že je potřeba implementovat všechny metody originálního objektu, které chceme mít přístupné.
</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 ===