Nedočkavé / lenivé načítanie v režime dlhodobého spánku

Perzistencia hore

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Úvod

Pri práci s ORM možno načítanie / načítanie údajov rozdeliť do dvoch typov: dychtivé a lenivé.

V tomto rýchlom článku sa chystáme poukázať na rozdiely a ukázať, že je možné ich použiť v režime dlhodobého spánku.

2. Maven závislosti

Aby sme mohli používať režim dlhodobého spánku, definujme najskôr hlavnú závislosť v našej pom.xml:

 org.hibernate hibernate-core 5.2.2.Final 

Najnovšiu verziu režimu dlhodobého spánku nájdete tu.

3. Nedočkavé a lenivé načítanie

Prvá vec, ktorú by sme tu mali prediskutovať, je to, čo sú lenivé načítanie a nedočkavé načítanie:

  • Nedočkavé načítanie je návrhový vzor, ​​v ktorom dochádza k inicializácii údajov na mieste
  • Lenivé načítanie je návrhový vzor, ​​ktorý sa používa na odloženie inicializácie objektu, pokiaľ je to možné

Pozrime sa, ako to vlastne funguje, na niekoľkých príkladoch:

The UserLazy trieda:

@Entity @Table (name = "USER") verejná trieda UserLazy implementuje Serializable {@Id @GeneratedValue @Column (name = "USER_ID") private Long userId; @OneToMany (fetch = FetchType.LAZY, mappedBy = "user") private Set orderDetail = nový HashSet (); // štandardní zadávatelia a getri // tiež prepíšu equals a hashcode}

The OrderDetail trieda:

@Entity @Table (name = "USER_ORDER") verejná trieda OrderDetail implementuje Serializable {@Id @GeneratedValue @Column (name = "ORDER_ID") private Long orderId; @ManyToOne (fetch = FetchType.LAZY) @JoinColumn (name = "USER_ID") súkromný používateľ UserLazy; // štandardní zadávatelia a getri // tiež prepíšu equals a hashcode}

Jeden Používateľ môže mať viac Detaily objednávky. V nedočkavej stratégii načítania, ak načítame Používateľ údaje, načíta tiež všetky objednávky s nimi spojené a uloží ich do pamäte.

Ale keď je povolené lenivé načítanie, ak vytiahneme a UserLazy, OrderDetail údaje sa nebudú inicializovať a načítať do pamäte, kým na ne explicitne nezavoláte.

V nasledujúcej časti uvidíme, ako sa vyššie uvedený príklad implementuje v režime dlhodobého spánku.

4. Načítanie konfigurácie

V tejto časti sa pozrieme na to, ako môžeme nakonfigurovať stratégie načítania v režime dlhodobého spánku. Príklady z predchádzajúcej časti znova použijeme.

Lenivé načítanie je možné jednoducho povoliť pomocou nasledujúceho parametra anotácie:

fetch = FetchType.LAZY

Na použitie načítania dychtivosti sa používa nasledujúci parameter:

fetch = FetchType.EAGER

Na nastavenie Eager Loading sme použili UserLazyVolala trieda dvojčiat UserEager.

V nasledujúcej časti sa pozrieme na rozdiely medzi týmito dvoma typmi načítania.

5. Rozdiely

Ako sme už spomenuli, hlavným rozdielom medzi týmito dvoma typmi načítania je okamih, keď sa údaje načítajú do pamäte.

Pozrime sa na tento príklad:

Zoznam používateľov = sessionLazy.createQuery ("From UserLazy"). List (); UserLazy userLazyLoaded = users.get (3); návrat (userLazyLoaded.getOrderDetail ());

Vďaka prístupu lenivej inicializácie orderDetailSet sa inicializuje iba vtedy, ak je explicitne volaná pomocou getra alebo inej metódy, ako je uvedené v príklade vyššie:

UserLazy userLazyLoaded = users.get (3);

Ale s nedočkavým prístupom v UserEager bude sa inicializovať okamžite v prvom riadku vyššie uvedeného príkladu:

Zoznam user = sessionEager.createQuery ("From UserEager"). List ();

Na lenivé načítanie sa používa objekt proxy a na načítanie servera sa spustí samostatný dotaz SQL orderDetailSet .

Myšlienka zakázania servera proxy alebo lenivého načítania sa v režime dlhodobého spánku považuje za zlý postup. Môže to mať za následok načítanie veľkého množstva údajov z databázy a ukladanie do pamäte bez ohľadu na to, či sú potrebné.

Na otestovanie vyššie uvedenej funkčnosti je možné použiť nasledujúcu metódu:

Hibernate.isInitialized (orderDetailSet);

Teraz je dôležité pozrieť sa na dotazy, ktoré sa generujú v obidvoch prípadoch:

pravda

Vyššie uvedené nastavenie v načítanie.hbm.xml zobrazuje vygenerované dotazy SQL. Ak sa pozriete na výstup z konzoly, uvidíte vygenerované dotazy.

Pre Lazy načítanie dotazu, ktorý je vygenerovaný na načítanie súboru Používateľ údaje:

vyberte user0_.USER_ID ako USER_ID1_0_, ... z USER user0_

Pri nedočkavom načítaní sme však videli, ako sa vytvára spoj USER_ORDER:

vyberte orderdetai0_.USER_ID ako USER_ID4_0_0_, orderdetai0_.ORDER_ID ako ORDER_ID1_1_0_, orderdetai0_ ... z USER_ORDER orderdetai0_ kde orderdetai0_.USER_ID =?

Vyššie uvedený dopyt je generovaný pre všetkých Používatelia, čo má za následok oveľa väčšie využitie pamäte ako v inom prístupe.

6. Výhody a nevýhody

6.1. Lenivé načítanie

Výhody:

  • Počiatočná doba načítania je oveľa menšia ako v prípade iného prístupu
  • Menšia spotreba pamäte ako v inom prístupe

Nevýhody:

  • Oneskorená inicializácia môže mať vplyv na výkon počas nežiaducich momentov
  • V niektorých prípadoch musíte s lenivo inicializovanými objektmi zaobchádzať so zvláštnou opatrnosťou, inak by sa mohla vyskytnúť výnimka

6.2. Nedočkavé načítanie:

Výhody:

  • Žiadne oneskorené vplyvy na výkon spojené s inicializáciou

Nevýhody:

  • Dlhý počiatočný čas načítania
  • Načítanie príliš veľkého množstva nepotrebných údajov môže mať vplyv na výkon

7. Lenivé načítanie v režime dlhodobého spánku

Režim dlhodobého spánku aplikuje na subjekty a združenia prístup lenivého načítania poskytnutím implementácie proxy servera tried.

Hibernate zachytáva volania entity tak, že ju nahradí proxy odvodeným z triedy entity. V našom príklade, keď požadované informácie chýbajú, načítajú sa z databázy pred postúpením kontroly na server Používateľ triedna implementácia.

Je tiež potrebné poznamenať, že keď je asociácia reprezentovaná ako trieda kolekcie (vo vyššie uvedených príkladoch je reprezentovaná ako Nastaviť orderDetailSet), potom sa vytvorí obal a nahradí sa originálna kolekcia.

Ak sa chcete dozvedieť viac informácií o návrhovom vzore servera proxy, môžete sa pozrieť tu.

8. Záver

V tomto článku sme si ukázali príklady dvoch hlavných typov načítania, ktoré sa používajú v režime dlhodobého spánku.

Ak sa chcete dozvedieť viac o pokročilej úrovni znalostí, môžete sa pozrieť na oficiálne webové stránky režimu dlhodobého spánku. Ak chcete získať kód popísaný v tomto článku, pozrite si toto úložisko.

Perzistencia dno

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

$config[zx-auto] not found$config[zx-overlay] not found