Čo je to Hi / Lo algoritmus?

1. Úvod

V tomto tutoriále vysvetlíme Hi / Lo Algoritmus. Používa sa väčšinou ako a stratégia generovania databázových identifikátorov.

Začneme s prehľadom algoritmu. Potom si ukážeme praktický príklad založený na rámci režimu dlhodobého spánku. Na záver si rozoberieme prípady použitia algoritmu, jeho výhody a nevýhody.

2. Hi / Lo Algorithm Overview

2.1 Definícia

Hlavným účelom algoritmu Hi / Lo je: vytvorte rozsah čísel, ktoré možno bezpečne použiť ako identifikátory databázy. Používa na to tri bežne menované početné premenné vysoký nízkya incrementSize.

The incrementSize premenná obsahuje maximálny počet identifikátorov, ktoré je možné vygenerovať v jednej dávke. Malo by sa s ňou zaobchádzať ako s konštantnou hodnotou definovanou na začiatku algoritmu. Akákoľvek úprava za behu môže spôsobiť vážne problémy v prostrediach, kde viacerí klienti používajú na uchovanie položiek rovnakú konfiguráciu Hi / Lo.

The vysoká premenná sa obvykle priraďuje z databázovej sekvencie. V takom prípade sme si istí, že nikto nezíska dvakrát rovnaké číslo.

The nízka premenná obsahuje aktuálne priradené číslo v rozsahu [0, incrementSize).

Vzhľadom na tieto body generuje algoritmus Hi / Lo hodnoty v rozsahu [(Ahoj – 1) * incrementSize + 1, (ahoj * incrementSize)).

2.2 Pseudokód

Pozrime sa na kroky na generovanie novej hodnoty pomocou algoritmu Hi / Lo:

  • ak nízka je väčšie alebo rovné incrementSize, priradiť novú hodnotu vysoká a resetovať nízka na 0
  • vygenerujte novú hodnotu pomocou vzorca: (vysoká – 1) * incrementSize + nízka
  • prírastok nízka o 1
  • vráti vygenerovanú hodnotu

3. Praktický príklad

Pozrime sa na algoritmus Hi / Lo v akcii. Aby sme to dosiahli, použijeme rámec dlhodobého spánku a jeho implementáciu Hi / Lo.

Najskôr definujme databázovú entitu, s ktorou budeme pracovať:

@Entity public class RestaurantOrder {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE, generator = "hilo_sequence_generator") @GenericGenerator (name = "hilo_sequence_generator", strategy = "sequence", parameters = {@Parameter (name = "sequence_name", value = "hilo_seqeunce"), @Parameter (name = "initial_value", value = "1"), @Parameter (name = "increment_size", value = "3"), @Parameter (name = "optimizer", value = "hilo")}) súkromné ​​Long id; }

Je to jednoduchá objednávka reštaurácie s jedným id lúka. Ak chcete správne definovať algoritmus Hi / Lo v režime dlhodobého spánku, v definícii id pole, musíme zvoliť a postupnosť stratégia - hilo optimalizátor - a zadajte increment_size parameter.

Aby sme zobrazili algoritmus Hi / Lo v akcii, zachováme deväť objednávok reštaurácií v cykle:

public void persist () {Transaction transaction = session.beginTransaction (); pre (int i = 0; i <9; i ++) {session.persist (new RestaurantOrder ()); session.flush (); } transaction.commit (); }

Podľa zadanej veľkosti prírastku v entite by sme pre ďalšie mali mať iba tri volania do databázy vysoká hodnotu. Za predpokladu, že sekvencia databázy začína od 1, bude prvá dávka vygenerovaných identifikátorov v rozmedzí [1,3].

Keď algoritmus Hi / Lo vráti hodnotu 3 a režim dlhodobého spánku požiada o hodnotu nasledujúceho identifikátora, hodnota parametra nízka premenná sa rovná incrementSize konštantný. V takom prípade ďalšie volanie do databázy pre nové vysoká hodnota musí byť urobená. Mať 2 ako nové vysoká hodnota, algoritmus generuje hodnoty v rozsahu [4,6].

Nakoniec posledné volanie do databázy pre ďalšie vysoká hodnota sa urobí a entitám sa priradia hodnoty v rozsahu [7, 9].

Hibernovať protokoly zachytené počas vykonávania pretrvávať () metódou potvrdiť tieto hodnoty:

Hibernate: volať ďalšiu hodnotu pre hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - získaná sekvenčná hodnota: 1 org.hibernate.event.internal.AbstractSaveEventListener - vygenerovaný identifikátor: 1, pomocou stratégie: org.hibernate.id.enhanced.SequenceStyleGenerator org .hibernate.event.internal.AbstractSaveEventListener - vygenerovaný identifikátor: 2, využívajúci stratégiu: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - vygenerovaný identifikátor: 3, využívajúci stratégiu: org.hibernate.id. enhanced.SequenceStyleGenerator Hibernate: volať ďalšiu hodnotu pre hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - získaná hodnota sekvencie: 2 org.hibernate.event.internal.AbstractSaveEventListener - vygenerovaný identifikátor: 4, s použitím stratégie: org.hibernate.id.enhanced .SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - vygenerovaný identifikátor: 5 pomocou stratégie: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal. AbstractSaveEventListener - Vygenerovaný identifikátor: 6, využívajúci stratégiu: org.hibernate.id.enhanced.SequenceStyleGenerator Hibernate: zavolajte ďalšiu hodnotu pre hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - získaná hodnota sekvencie: 3 org.hibernate.event.internal.AbstractSaveEventListener - Generovaný identifikátor: 7, využívajúci stratégiu: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generovaný identifikátor: 8, používajúci stratégiu: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event .internal.AbstractSaveEventListener - vygenerovaný identifikátor: 9 pomocou stratégie: org.hibernate.id.enhanced.SequenceStyleGenerator

4. Algoritmické výhody a nevýhody

Hlavnou výhodou algoritmu Hi / Lo je znížený počet volaní do databázy pre ďalšie hodnoty sekvencie. Zvyšovanie hodnoty incrementSize znižuje počet spiatočných letov do databázy. Je zrejmé, že to znamená zvýšenie výkonnosti našej aplikácie. Okrem toho je algoritmom Hi / Lo a preferovaná voľba v prostrediach so slabým pripojením na internet.

Na druhej strane algoritmus Hi / Lo nie je najlepšou voľbou v prostrediach, kde viac rôznych klientov uchováva údaje v databáze v tej istej tabuľke. Aplikácie tretích strán si možno neuvedomujú Hi / Lo stratégiu, ktorú používame na generovanie identifikátorov. Vo výsledku môžu používať ID entít z vygenerovaného rozsahu čísel, ktorý sa v súčasnosti používa v našej aplikácii. V takom prípade sa pri pretrvávaní údajov môžeme stretnúť s chybami, ktoré je ťažké opraviť.

5. Záver

V tomto tutoriáli sme diskutovali o algoritme Hi / Lo.

Najprv sme vysvetlili, ako to funguje, a diskutovali sme o jeho implementácii pseudokódu. Potom sme si ukázali praktický príklad pomocou implementácie algoritmu Hibernate. Nakoniec sme vymenovali Hi / Lo výhody a nevýhody.

Ako vždy, kód zobrazený v tomto článku je k dispozícii na GitHub.


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