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.