Mi a Hi / Lo algoritmus?

1. Bemutatkozás

Ebben az oktatóanyagban elmagyarázzuk a Hi / Lo algoritmust. Leginkább a-ként használják adatbázis-azonosító létrehozási stratégia.

Kezdjük az algoritmus áttekintésével. Ezután bemutatunk egy gyakorlati példát a Hibernate keretrendszer alapján. Végül megvitatjuk az algoritmus használati eseteit, előnyeit és hátrányait.

2. Hi / Lo algoritmus áttekintés

2.1 Meghatározás

A Hi / Lo algoritmus fő célja: hozzon létre egy számtartományt, amely biztonságosan felhasználható adatbázis-azonosítóként. Ehhez három általánosan hívott számváltozót használ magas alacsony, és incrementSize.

A incrementSize változó az egy kötegben előállítható azonosítók maximális számát tartalmazza. Az algoritmus elején meghatározott állandó értékként kell kezelni. Bármely futásidejű módosítás komoly problémákat okozhat olyan környezetekben, ahol több kliens ugyanazt a Hi / Lo konfigurációt használja a bejegyzések fenntartásához.

A magas változót általában egy adatbázis szekvenciából rendeljük hozzá. Ebben az esetben biztosak vagyunk abban, hogy senki sem kapja meg kétszer ugyanazt a számot.

A alacsony változó az aktuálisan hozzárendelt számot tartja a tartományban [0, inkrementSize).

Ezeket a pontokat figyelembe véve a Hi / Lo algoritmus a [(Szia – 1) * incrementSize + 1, (szia * inkrementSize)).

2.2 Álkód

Vizsgáljuk meg az új érték előállításának lépéseit a Hi / Lo algoritmus segítségével:

  • ha alacsony nagyobb vagy egyenlő incrementSize, rendeljen új értéket a magas és nullázza alacsony 0-ra
  • új értéket generál a következő képlettel: (magas – 1) * incrementSize + alacsony
  • növekedés alacsony által 1
  • adja vissza a létrehozott értéket

3. Gyakorlati példa

Lássuk működés közben a Hi / Lo algoritmust. Ehhez a Hibernate keretrendszert és annak Hi / Lo megvalósítását fogjuk használni.

Először határozzunk meg egy adatbázis-entitást, amellyel együtt dolgozhat:

@Entity public class RestaurantOrder {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE, generator = "hilo_sequence_generator") @GenericGenerator (név = "hilo_sequence_generator", stratégia = "szekvencia", paraméterek = {@Paraméter (név = "sorozat_név", érték = "hilo_seqeunce"), @Parameter (név = "kezdeti_érték", érték = "1"), @Paraméter (név = "növekmény_méret", érték = "3"), @Paraméter (név = "optimalizáló", érték = "hilo")}) private Long id; }

Ez egy egyszerű éttermi megrendelés id terület. A Hi / Lo algoritmus hibernált állapotban történő helyes meghatározásához a id mezőt kell választanunk a sorrend stratégia - hilo optimalizáló - és adja meg a növekmény_méret paraméter.

A Hi / Lo algoritmus működésének megjelenítéséhez kilenc éttermi megrendelést tartunk fenn egy ciklusban:

public void persist () {Tranzakciós tranzakció = session.beginTransaction (); for (int i = 0; i <9; i ++) {session.persist (új RestaurantOrder ()); session.flush (); } tranzakció.vállalás (); }

Az entitásban megadott növekmény nagysága szerint a következőre csak három hívást kell megadnunk az adatbázisba magas érték. Feltéve, hogy az adatbázis szekvenciája 1-től kezdődik, a generált azonosítók első kötege az [1,3] tartományba esik.

Amikor a Hi / Lo algoritmus 3-at ad vissza, és a hibernált állapot kéri a következő azonosító értékét, akkor a alacsony változó egyenlő a incrementSize állandó. Ebben az esetben a következő hívás az új adatbázisra magas értéket kell tenni. Miután 2 új magas értéket, az algoritmus a [4,6] tartományban generál értékeket.

Végül az utolsó hívás az adatbázisba a következőre magas érték készül, és a [7, 9] tartományban lévő értékeket hozzárendelik az entitásokhoz.

A .fájl végrehajtása során elfogott hibernált naplók kitartani () módszerrel erősítse meg ezeket az értékeket:

Hibernálás: a hilo_seqeunce következő értékének meghívása org.hibernate.id.enhanced.SequenceStructure - Szekvenciaérték: 1 org.hibernate.event.internal.AbstractSaveEventListener - Generált azonosító: 1, stratégia: org.hibernate.id.enhanced.SequenceStyleGenerator org .hibernate.event.internal.AbstractSaveEventListener - Generált azonosító: 2, stratégia használata: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generált azonosító: 3, stratégia használata: org.hibernate.id. advanced.SequenceStyleGenerator Hibernate: hívja a hilo_seqeunce következő értékét org.hibernate.id.enhanced.SequenceStructure - Szekvenciaérték kapott: 2 org.hibernate.event.internal.AbstractSaveEventListener - Generált azonosító: 4, a stratégia használatával: org.hibernate.id.enhanced .SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generált azonosító: 5, a stratégia használatával: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal. AbstractSaveEventListener - Létrehozott azonosító: 6, a következő stratégia használatával: org.hibernate.id.enhanced.SequenceStyleGenerator Hibernate: hívja a hilo_seqeunce következő értékét org.hibernate.id.enhanced.SequenceStructure - A kapott érték: 3 org.hibernate.event.internal.Ab Abstract - Generált azonosító: 7, stratégia használatával: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Generált azonosító: 8, stratégia használatával: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event .internal.AbstractSaveEventListener - Generált azonosító: 9, stratégia használatával: org.hibernate.id.enhanced.SequenceStyleGenerator

4. Algoritmus előnyei és hátrányai

A Hi / Lo algoritmus fő előnye a csökkentett számú adatbázis-hívás a következő szekvenciaértékekhez. Értékének növelése incrementSize csökken az oda-vissza út az adatbázisba. Ez nyilvánvalóan teljesítménynövekedést jelent alkalmazásunkban. Ezen felül a Hi / Lo algoritmus a előnyös választás gyenge internetkapcsolattal rendelkező környezetben.

Másrészt a Hi / Lo algoritmus nem a legjobb választás olyan környezetekben, ahol több különböző kliens tárolja az adatokat ugyanabban a táblázatban egy adatbázisban. Előfordulhat, hogy harmadik féltől származó alkalmazások nincsenek tisztában az azonosítók előállításához használt Hi / Lo stratégiával. Ennek eredményeként felhasználhatják az entitásazonosítókat az alkalmazásunkban jelenleg használt számok generált tartományából. Ebben az esetben az adatok tartósan fennállása során nehézségekbe ütközhetünk.

5. Következtetés

Ebben az oktatóanyagban megvitattuk a Hi / Lo algoritmust.

Először elmagyaráztuk a működését, és megvitattuk az álkód megvalósítását. Ezután bemutattunk egy gyakorlati példát a Hibernate algoritmus megvalósításával. Végül felsoroltuk a Hi / Lo előnyeit és hátrányait.

Mint mindig, az ebben a cikkben bemutatott kód elérhető a GitHubon.