Wat is het Hi / Lo-algoritme?

1. Inleiding

In deze tutorial leggen we het Hi / Lo-algoritme uit. Het wordt meestal gebruikt als een strategie voor het genereren van database-ID's.

We beginnen met het algoritme-overzicht. Vervolgens laten we een praktisch voorbeeld zien op basis van het Hibernate-framework. Ten slotte bespreken we de use-cases van het algoritme, de voordelen en de nadelen ervan.

2. Overzicht hoog / laag algoritme

2.1 Definitie

Het belangrijkste doel van het Hi / Lo-algoritme is om maak een reeks nummers die veilig kunnen worden gebruikt als database-ID's. Om dat te doen, gebruikt het drie numerieke variabelen die gewoonlijk worden genoemd hoog laag, en incrementSize.

De incrementSize variabele bevat het maximale aantal ID's dat in één batch kan worden gegenereerd. Het moet worden behandeld als een constante waarde die aan het begin van het algoritme wordt gedefinieerd. Elke runtime-wijziging kan ernstige problemen veroorzaken in omgevingen waar meerdere clients dezelfde Hi / Lo-configuratie gebruiken om vermeldingen vast te houden.

De hoog variabele wordt meestal toegewezen vanuit een databasesequentie. In dat geval weten we zeker dat niemand hetzelfde nummer twee keer krijgt.

De laag variabele bevat het momenteel toegewezen nummer in het bereik [0, incrementSize).

Gegeven deze punten genereert het Hi / Lo-algoritme waarden in het bereik [(Hoi – 1) * incrementSize + 1, (hi * incrementSize)).

2.2 Pseudocode

Laten we eens kijken naar de stappen voor het genereren van een nieuwe waarde met behulp van het Hi / Lo-algoritme:

  • als laag is groter dan of gelijk aan incrementSize, wijs een nieuwe waarde toe aan hoog en reset laag tot 0
  • genereer een nieuwe waarde met de formule: (hoog – 1) * incrementSize + laag
  • toename laag door 1
  • retourneer de gegenereerde waarde

3. Praktisch voorbeeld

Laten we het Hi / Lo-algoritme in actie zien. Om dat te doen, gebruiken we het Hibernate-framework en de Hi / Lo-implementatie ervan.

Laten we eerst een database-entiteit definiëren om mee te werken:

@Entity openbare klasse RestaurantOrder {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE, generator = "hilo_sequence_generator") @GenericGenerator (name = "hilo_sequence_generator", strategy = "sequence", parameters = {@Parameter (name = "sequence_name", value = "hilo_seqeunce"), @Parameter (name = "initial_value", value = "1"), @Parameter (name = "increment_size", value = "3"), @Parameter (name = "optimizer", value = "hilo")}) privé Lange id; }

Het is een eenvoudige restaurantbestelling met één ID kaart veld. Om het Hi / Lo-algoritme in Hibernate correct te definiëren, in de definitie van het ID kaart veld, moeten we een volgorde strategie - hilo optimizer - en specificeer het increment_size parameter.

Om het Hi / Lo-algoritme in actie te laten zien, zullen we negen restaurantbestellingen achter elkaar aanhouden:

public void persist () {Transactie transactie = session.beginTransaction (); voor (int i = 0; i <9; i ++) {session.persist (new RestaurantOrder ()); sessie.flush (); } transaction.commit (); }

Volgens de opgegeven incrementgrootte in de entiteit zouden we voor de volgende slechts drie aanroepen naar de database moeten hebben hoog waarde. Ervan uitgaande dat de databasesequentie begint bij 1, zal de eerste batch met gegenereerde ID's in het bereik [1,3] liggen.

Wanneer het Hi / Lo-algoritme 3 retourneert en Hibernate vraagt ​​om de waarde van de volgende identifier, de waarde van de laag variabele is gelijk aan de incrementSize constante. In dat geval is de volgende aanroep naar de database voor het nieuwe hoog waarde moet worden gemaakt. Met 2 als nieuw hoog waarde, genereert het algoritme waarden in het bereik [4,6].

Eindelijk de laatste oproep naar de database voor de volgende hoog waarde wordt gemaakt en waarden in het bereik [7, 9] worden aan de entiteiten toegewezen.

Slaapstandlogboeken die zijn vastgelegd tijdens de uitvoering van het volharden () methode bevestig die waarden:

Hibernate: roep volgende waarde aan voor hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Sequentiewaarde verkregen: 1 org.hibernate.event.internal.AbstractSaveEventListener - Gegenereerde identifier: 1, met behulp van strategie: org.hibernate.id.enhanced.SequenceStyleGenerator org .hibernate.event.internal.AbstractSaveEventListener - Gegenereerde identifier: 2, met behulp van strategie: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Gegenereerde identifier: 3, met behulp van strategie: org.hibernate.id. Enhanced.SequenceStyleGenerator Hibernate: roep volgende waarde aan voor hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Sequence-waarde verkregen: 2 org.hibernate.event.internal.AbstractSaveEventListener - Gegenereerde identifier: 4, met behulp van strategie: org.hibernate.id.enhanced .SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Gegenereerde identifier: 5, met behulp van strategie: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal. AbstractSaveEventListener - Gegenereerde identifier: 6, met behulp van strategie: org.hibernate.id.enhanced.SequenceStyleGenerator Hibernate: roep de volgende waarde aan voor hilo_seqeunce org.hibernate.id.enhanced.SequenceStructure - Sequentiewaarde verkregen: 3 org.hibernate.event.internal.AbstractSaveEventListener - Gegenereerde identifier: 7, met behulp van strategie: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event.internal.AbstractSaveEventListener - Gegenereerde identifier: 8, met behulp van strategie: org.hibernate.id.enhanced.SequenceStyleGenerator org.hibernate.event .internal.AbstractSaveEventListener - Gegenereerde identifier: 9, met behulp van strategie: org.hibernate.id.enhanced.SequenceStyleGenerator

4. Algoritme voordelen en nadelen

Het belangrijkste voordeel van het Hi / Lo-algoritme is de verminderd aantal databaseaanroepen voor de volgende reekswaarden. Verhogen van de waarde van incrementSize vermindert het aantal retourvluchten naar de database. Dat betekent uiteraard een prestatiewinst in onze applicatie. Daarnaast is het Hi / Lo-algoritme een voorkeur in omgevingen met een zwakke internetverbinding.

Aan de andere kant, het Hi / Lo-algoritme is niet de beste keuze in omgevingen waar meerdere verschillende clients gegevens naar dezelfde tabel in een database persisteren. Toepassingen van derden zijn mogelijk niet op de hoogte van de Hi / Lo-strategie die we gebruiken om ID's te genereren. Als gevolg hiervan kunnen ze entiteits-ID's gebruiken uit het gegenereerde bereik van nummers die momenteel in onze applicatie worden gebruikt. In dat geval kunnen we bij het bewaren van gegevens fouten tegenkomen die moeilijk op te lossen zijn.

5. Conclusie

In deze tutorial hebben we het Hi / Lo-algoritme besproken.

Eerst legden we uit hoe het werkt en bespraken we de implementatie van de pseudocode. Vervolgens hebben we een praktisch voorbeeld laten zien met behulp van de algoritme-implementatie van Hibernate. Ten slotte hebben we de voordelen en nadelen van Hi / Lo opgesomd.

Zoals altijd is de code die in dit artikel wordt getoond, beschikbaar op GitHub.