Hvad er Hi / Lo-algoritmen?

1. Introduktion

I denne vejledning forklarer vi Hi / Lo-algoritmen. Det bruges mest som en database-identifikationsstrategi.

Vi starter med algoritmeoversigten. Derefter viser vi et praktisk eksempel baseret på dvale-rammen. Endelig vil vi diskutere algoritmens brugssager, dens fordele og ulemper.

2. Hi / Lo algoritme oversigt

2.1 Definition

Hovedformålet med Hi / Lo-algoritmen er at oprette en række numre, der sikkert kan bruges som databaseidentifikatorer. For at gøre det bruger den tre nummervariabler, der almindeligvis kaldes høj lavog inkrementSize.

Det inkrementSize variabel indeholder det maksimale antal identifikatorer, der kan genereres i en batch. Det skal behandles som en konstant værdi defineret i starten af ​​algoritmen. Enhver runtime-ændring kan forårsage alvorlige problemer i miljøer, hvor flere klienter bruger den samme Hi / Lo-konfiguration til at opretholde poster.

Det høj variabel tildeles normalt fra en databasesekvens. I så fald er vi sikre på, at ingen får det samme nummer to gange.

Det lav variabel holder det aktuelt tildelte nummer i området [0, inkrementSize).

I betragtning af disse punkter genererer Hi / Lo-algoritmen værdier i området [(Hej – 1) * inkrementSize + 1, (hej * inkrementSize)).

2.2 Pseudokode

Lad os se på trinene til generering af en ny værdi ved hjælp af Hi / Lo-algoritmen:

  • hvis lav er større end eller lig med inkrementSize, tildel en ny værdi til høj og nulstil lav til 0
  • generere en ny værdi med formlen: (høj – 1) * inkrementSize + lav
  • stigning lav ved 1
  • returner den genererede værdi

3. Praktisk eksempel

Lad os se Hi / Lo-algoritmen i aktion. For at gøre det bruger vi dvale-rammen og dens Hi / Lo-implementering.

Lad os først definere en databaseenhed, der skal arbejdes med:

@Entity offentlig klasse RestaurantOrder {@Id @GeneratedValue (strategi = GenerationType.SEQUENCE, generator = "hilo_sequence_generator") @GenericGenerator (navn = "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 simpel restaurantbestilling med en id Mark. For korrekt at definere Hi / Lo-algoritmen i dvale i definitionen af id felt, skal vi vælge et sekvens strategi - hilo optimizer - og angiv inkrement_size parameter.

For at vise Hi / Lo-algoritmen i aktion fortsætter vi ni restaurantordrer i en løkke:

public void persist () {Transaktionstransaktion = session.beginTransaction (); for (int i = 0; i <9; i ++) {session.persist (ny RestaurantOrder ()); session.flush (); } transaktion.forpligtelse (); }

I henhold til den specificerede stigningsstørrelse i enheden skal vi kun have tre opkald til databasen til den næste høj værdi. Hvis vi antager, at databasesekvensen starter fra 1, vil den første batch af genererede identifikatorer være i området [1,3].

Når Hi / Lo-algoritmen returnerer 3, og Dvaletilstand beder om den næste identifikators værdi, værdien af lav variabel er lig med inkrementSize konstant. I så fald er det næste opkald til databasen for det nye høj værdi skal laves. At have 2 som den nye høj værdi genererer algoritmen værdier i området [4,6].

Endelig det sidste opkald til databasen til det næste høj værdi oprettes, og værdier i området [7, 9] tildeles enhederne.

Dvale logfiler fanget under udførelsen af vedvarer () metode bekræfter disse værdier:

Dvaletilstand: kald næste værdi for hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Opnået sekvensværdi: 1 org.hibernate.event.internal.AbstractSaveEventListener - Genereret identifikator: 1 ved hjælp af strategi: org.hibernate.id.enhanced.SequenceStyleGty .hibernate.event.internal.AbstractSaveEventListener - Genereret identifikator: 2, ved hjælp af strategi: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Genereret identifikator: 3, ved hjælp af strategi: org.hibernate.id. extended.SequenceStyleGenerator Hibernate: kald næste værdi for hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Sekvensværdi opnået: 2 org.hibernate.event.internal.AbstractSaveEventListener - Genereret identifikator: 4 ved hjælp af strategi: org.hibernate.id. .SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Genereret identifikator: 5 ved hjælp af strategi: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal. AbstractSaveEventListener - Genereret identifikator: 6, ved hjælp af strategi: org.hibernate.id.enhanced.SequenceStyleGenerator Dvaletilstand: kalder næste værdi for hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Opnået sekvensværdi: 3 org.hibernate.eventre.inventar.internal. - Genereret identifikator: 7 ved hjælp af strategi: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Genereret identifikator: 8 ved hjælp af strategi: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event .internal.AbstractSaveEventListener - Genereret identifikator: 9 ved hjælp af strategi: org.hibernate.id.enhanced.SequenceStyleGenerator

4. Algoritme fordele og ulemper

Den største fordel ved Hi / Lo-algoritmen er reduceret antal databaseopkald for de næste sekvensværdier. Forøgelse af værdien af inkrementSize reducerer antallet af returrejser til databasen. Det betyder selvfølgelig, at vi får en præstationsgevinst i vores ansøgning. Derudover er Hi / Lo-algoritmen en foretrukket valg i miljøer med en svag internetforbindelse.

På den anden side, Hi / Lo algoritmen er ikke det bedste valg i miljøer, hvor flere forskellige klienter vedvarer data til den samme tabel i en database. Tredjepartsapplikationer er muligvis uvidende om den Hi / Lo-strategi, vi bruger til at generere identifikatorer. Som et resultat bruger de muligvis enheds-id'er fra det genererede antal numre, der bruges i øjeblikket i vores applikation. I så fald, når vi vedvarer data, kan vi støde på fejl, der er svære at rette.

5. Konklusion

I denne vejledning diskuterede vi Hi / Lo-algoritmen.

Først forklarede vi, hvordan det fungerer, og diskuterede dets implementering af pseudokode. Derefter viste vi et praktisk eksempel ved hjælp af Hibernates algoritmeimplementering. Endelig opførte vi Hi / Lo fordele og ulemper.

Som altid er koden vist i denne artikel tilgængelig på GitHub.


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