Hva er Hi / Lo-algoritmen?

1. Introduksjon

I denne opplæringen forklarer vi Hi / Lo-algoritmen. Det brukes mest som en database genereringsstrategi.

Vi starter med algoritmeoversikten. Deretter viser vi et praktisk eksempel basert på dvalemodus. Til slutt vil vi diskutere algoritmens brukstilfeller, fordelene og ulempene.

2. Hi / Lo algoritme oversikt

2.1 Definisjon

Hovedformålet med Hi / Lo-algoritmen er å lage et utvalg av tall som trygt kan brukes som databaseidentifikatorer. For å gjøre det bruker den tre tallvariabler som ofte kalles høy lav, og inkrementSize.

De inkrementSize variabel inneholder maksimalt antall identifikatorer som kan genereres i en batch. Det bør behandles som en konstant verdi definert i begynnelsen av algoritmen. Enhver kjøretidsendring kan føre til alvorlige problemer i miljøer der flere klienter bruker samme Hi / Lo-konfigurasjon for å vedvare oppføringer.

De høy variabel tilordnes vanligvis fra en databasesekvens. I så fall er vi sikre på at ingen vil få samme nummer to ganger.

De lav variabel inneholder det tildelte nummeret i området [0, inkrementSize).

Gitt disse punktene, genererer Hi / Lo-algoritmen verdier i området [(hei – 1) * inkrementSize + 1, (hei * inkrementSize)).

2.2 Pseudokode

La oss ta en titt på trinnene for å generere en ny verdi ved hjelp av Hi / Lo-algoritmen:

  • hvis lav er større enn eller lik inkrementSize, tilordne en ny verdi til høy og tilbakestille lav til 0
  • generere en ny verdi med formelen: (høy – 1) * inkrementSize + lav
  • økning lav innen 1
  • returner den genererte verdien

3. Praktisk eksempel

La oss se Hi / Lo-algoritmen i aksjon. For å gjøre det, bruker vi dvalemodus og dets Hi / Lo-implementering.

La oss først definere en databaseenhet å jobbe med:

@Entity offentlig klasse RestaurantOrder {@Id @GeneratedValue (strategi = GenerationType.SEQUENCE, generator = "hilo_sequence_generator") @GenericGenerator (name = "hilo_sequence_generator", strategi = "sekvens", parametre = {@ Parameter (navn = "sekvensnavn", value = "hilo_seqeunce"), @Parameter (name = "initial_value", value = "1"), @Parameter (name = "increment_size", value = "3"), @Parameter (name = "optimizer", value = "hilo")}) privat Lang id; }

Det er en enkel restaurantbestilling med en id felt. For å definere Hi / Lo-algoritmen riktig i dvalemodus, i definisjonen av id felt, må vi velge et sekvens strategi - hilo optimizer - og spesifiser inkrement_size parameter.

For å vise Hi / Lo-algoritmen i aksjon, fortsetter vi ni restaurantbestillinger i en løkke:

public void persist () {Transaksjonstransaksjon = session.beginTransaction (); for (int i = 0; i <9; i ++) {session.persist (ny RestaurantOrder ()); session.flush (); } transaction.commit (); }

I henhold til den angitte økningsstørrelsen i enheten, skal vi bare ha tre anrop til databasen for den neste høy verdi. Forutsatt at databasesekvensen starter fra 1, vil den første batchen med genererte identifikatorer være i området [1,3].

Når Hi / Lo-algoritmen returnerer 3 og dvalemodus ber om den neste identifikatorens verdi, verdien av lav variabel er lik inkrementSize konstant. I så fall neste anrop til databasen for det nye høy verdien må lages. Å ha 2 som den nye høy verdi genererer algoritmen verdier i området [4,6].

Endelig den siste samtalen til databasen for den neste høy verdien blir laget, og verdiene i området [7, 9] tildeles enhetene.

Dvale logger fanget under utførelsen av fortsette() metoden bekreft disse verdiene:

Dvalemodus: ring neste verdi for hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Oppnådd sekvensverdi: 1 org.hibernate.event.internal.AbstractSaveEventListener - Generert identifikator: 1, ved hjelp av strategi: org.hibernate.id.enhanced.SequenceStyleGty .hibernate.event.internal.AbstractSaveEventListener - Generert identifikator: 2, ved hjelp av strategi: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generert identifikator: 3, ved hjelp av strategi: org.hibernate.id. utvidet.SequenceStyleGenerator Dvalemodus: ring neste verdi for hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Sekvensverdi oppnådd: 2 org.hibernate.event.internal.AbstractSaveEventListener - Generert identifikator: 4, ved hjelp av strategi: org.hibernate.id. .SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generert identifikator: 5, ved hjelp av strategi: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal. AbstractSaveEventListener - Generert identifikator: 6, ved hjelp av strategi: org.hibernate.id.enhanced.SequenceStyleGenerator Dvalemodus: ring neste verdi for hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Sekvensverdi oppnådd: 3 org.hibernate.eventer.inventar. - Generert identifikator: 7, ved hjelp av strategi: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generert identifikator: 8, ved hjelp av strategi: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event .internal.AbstractSaveEventListener - Generert identifikator: 9, ved hjelp av strategi: org.hibernate.id.enhanced.SequenceStyleGenerator

4. Algoritme fordeler og ulemper

Den største fordelen med Hi / Lo-algoritmen er redusert antall databasesamtaler for de neste sekvensverdiene. Øke verdien av inkrementSize reduserer antall rundturer til databasen. Åpenbart betyr det en prestasjonsgevinst i applikasjonen vår. I tillegg til det er Hi / Lo-algoritmen en foretrukket valg i miljøer med svak internettforbindelse.

På den annen side, Hi / Lo-algoritmen er ikke det beste valget i miljøer der flere forskjellige klienter vedvarer data til samme tabell i en database. Tredjepartsapplikasjoner kan være uvitende om Hi / Lo-strategien vi bruker for å generere identifikatorer. Som et resultat kan de bruke enhets-ID-er fra det genererte nummerområdet som brukes for tiden i applikasjonen vår. I så fall, når vi vedvarer data, kan vi støte på feil som er vanskelige å fikse.

5. Konklusjon

I denne opplæringen diskuterte vi Hi / Lo-algoritmen.

Først forklarte vi hvordan det fungerer og diskuterte implementeringen av pseudokode. Deretter viste vi et praktisk eksempel ved hjelp av Hibernates algoritmeimplementering. Til slutt oppførte vi Hi / Lo fordeler og ulemper.

Som alltid er koden vist i denne artikkelen tilgjengelig på GitHub.


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