Što je Hi / Lo algoritam?

1. Uvod

U ovom uputstvu objasnit ćemo Hi / Lo algoritam. Koristi se uglavnom kao a strategija generiranja identifikatora baze podataka.

Započet ćemo s pregledom algoritma. Zatim ćemo pokazati praktični primjer zasnovan na okviru hibernacije. Na kraju ćemo razmotriti slučajeve upotrebe algoritma, njegove prednosti i nedostatke.

2. Pregled algoritma Hi / Lo

2.1 Definicija

Glavna svrha Hi / Lo algoritma je da stvoriti niz brojeva koji se mogu sigurno koristiti kao identifikatori baze podataka. Da bi to učinio, koristi tri brojčane varijable koje se obično nazivaju visoka niska, i inkrementSize.

The inkrementSize varijabla sadrži maksimalni broj identifikatora koji se mogu generirati u jednoj seriji. Treba je tretirati kao konstantnu vrijednost definiranu na početku algoritma. Svaka izmjena vremena izvođenja može uzrokovati ozbiljne probleme u okruženjima u kojima više klijenata koristi istu Hi / Lo konfiguraciju za zadržavanje unosa.

The visoko varijabla se obično dodjeljuje iz niza baze podataka. U tom smo slučaju sigurni da nitko neće dobiti isti broj dva puta.

The niska varijabla sadrži trenutno dodijeljeni broj u rasponu [0, inkrementSize).

S obzirom na ove točke, Hi / Lo algoritam generira vrijednosti u rasponu [(bok – 1) * inkrementSize + 1, (hi * inkrementSize)).

2.2 Pseudokod

Pogledajmo korake za generiranje nove vrijednosti pomoću Hi / Lo algoritma:

  • ako niska je veći ili jednak inkrementSize, dodijelite novu vrijednost visoko i resetirati niska do 0
  • generirati novu vrijednost s formulom: (visoko – 1) * inkrementSize + niska
  • prirast niska po 1
  • vratiti generiranu vrijednost

3. Praktični primjer

Pogledajmo Hi / Lo algoritam na djelu. Da bismo to učinili, koristit ćemo Hibernate okvir i njegovu Hi / Lo implementaciju.

Prvo definirajmo entitet baze podataka s kojim ćemo raditi:

@Entity javna klasa RestaurantOrder {@Id @GeneratedValue (strategija = GenerationType.SEQUENCE, generator = "hilo_sequence_generator") @GenericGenerator (name = "hilo_sequence_generator", strategija = "slijed", parametri = {@Parameter (name = "ime_sljedeće", value = "hilo_seqeunce"), @Parameter (name = "Initial_value", value = "1"), @Parameter (name = "increment_size", value = "3"), @Parameter (name = "optimizer", value = "hilo")}) private Long id; }

Jednostavna je narudžba u restoranu iskaznica polje. Da biste ispravno definirali Hi / Lo algoritam u hibernaciji, u definiciji iskaznica polje, moramo odabrati a slijed strategija - zdravo optimizer - i navedite prirast_velika parametar.

Da bismo pokazali Hi / Lo algoritam na djelu, u petlji ćemo ustrajati na devet narudžbi restorana:

javna void persist () {Transakcijska transakcija = session.beginTransaction (); for (int i = 0; i <9; i ++) {session.persist (new RestaurantOrder ()); session.flush (); } transakcija.commit (); }

Prema navedenoj veličini prirasta u entitetu, trebali bismo imati samo tri poziva baze podataka za sljedeći visoko vrijednost. Pod pretpostavkom da slijed baze podataka započinje od 1, prva serija generiranih identifikatora bit će u rasponu [1,3].

Kad Hi / Lo algoritam vrati 3 i Hibernate zatraži vrijednost sljedećeg identifikatora, vrijednost niska varijabla jednaka je inkrementSize konstantno. U tom slučaju, slijedeći poziv u bazu podataka za novi visoko mora se napraviti vrijednost. Imajući 2 kao nova visoko vrijednost, algoritam generira vrijednosti u rasponu [4,6].

Konačno, zadnji poziv bazi podataka za sljedeći visoko vrijednost se vrši, a vrijednosti u rasponu [7, 9] dodjeljuju se entitetima.

Dnevnici hibernacije snimljeni tijekom izvršavanja ustrajati() metoda potvrđuje te vrijednosti:

Hibernate: pozvati sljedeću vrijednost za hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - dobivena vrijednost sekvence: 1 org.hibernate.event.internal.AbstractSaveEventListener - generirani identifikator: 1, koristeći strategiju: org.hibernate.id.enhanced.SequenceStyleGenerator .hibernate.event.internal.AbstractSaveEventListener - Generirani identifikator: 2, koristeći strategiju: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generirani identifikator: 3, koristeći strategiju: org.hibernate.id. advanced.SequenceStyleGenerator Hibernate: pozivanje sljedeće vrijednosti za hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - dobivena vrijednost sekvence: 2 org.hibernate.event.internal.AbstractSaveEventListener - Generirani identifikator: 4, koristeći strategiju: org.hibernate.id.enhanced .SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generirani identifikator: 5, koristeći strategiju: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal. AbstractSaveEventListener - Generirani identifikator: 6, koristeći strategiju: org.hibernate.id.enhanced.SequenceStyleGenerator Hibernate: poziv sljedeće vrijednosti za hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - dobivena vrijednost sekvence: 3 org.hibernate.event.internal.Abstract - Generirani identifikator: 7, koristeći strategiju: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generirani identifikator: 8, koristeći strategiju: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event .internal.AbstractSaveEventListener - Generirani identifikator: 9, koristeći strategiju: org.hibernate.id.enhanced.SequenceStyleGenerator

4. Prednosti i nedostaci algoritma

Glavna prednost Hi / Lo algoritma je smanjen broj poziva baze podataka za sljedeće vrijednosti sekvence. Povećavanje vrijednosti inkrementSize smanjuje broj povratnih putovanja do baze podataka. Očito to znači poboljšanje performansi u našoj aplikaciji. Uz to, Hi / Lo algoritam je i preferirani izbor u okruženjima sa slabom internetskom vezom.

S druge strane, Hi / Lo algoritam nije najbolji izbor u okruženjima u kojima više različitih klijenata zadržava podatke u istoj tablici u bazi podataka. Aplikacije trećih strana možda nisu svjesne Hi / Lo strategije koju koristimo za generiranje identifikatora. Kao rezultat toga, mogli bi koristiti ID-ove entiteta iz generiranog raspona brojeva koji se trenutno koriste u našoj aplikaciji. U tom slučaju, prilikom trajnih podataka možemo naići na pogreške koje je teško ispraviti.

5. Zaključak

U ovom vodiču razgovarali smo o Hi / Lo algoritmu.

Prvo smo objasnili kako to funkcionira i razgovarali o njegovoj implementaciji pseudo koda. Zatim smo pokazali praktični primjer pomoću Hibernate-ove implementacije algoritma. Konačno, naveli smo Hi / Lo prednosti i nedostatke.

Kao i uvijek, kod prikazan u ovom članku dostupan je na GitHub-u.


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