A kulcs generálás a legtöbb esetben egy egyszerű számláló növelésével történik a DB oldalon: vesszük az utolsó rekord id-t, majd növeljük eggyel. Ez a megközelÃtés tökéletesen működik abban az esetben, ha egyszerre csak egy valaki Ãrja a DB-t.
Ha többen Ãrják párhuzamosan, akkor kezd problémás lenni, mivel minden Ãrás elÅ‘tt folyamatosan le kell kérnie a DB-nek a tábla utolsó rekordjának kulcs értékét, majd növelnie kell eggyel azt. Ez a folytonos olvasás és Ãrás drasztikusan tudja rontani az Ãrás sebességét.
Az Ãrás esetén szükséges kulcs olvasások számának minimalizálásra találták ki a Hi-Lo algoritmust. Ennek a lényegét egy példán keresztül könnyű bemutatni:
Tételezzük fel, hogy Alice és Bob egyszerre szeretnék Ãrni az adatbázist.
Alice két értéket kér ki a DB-től. A legutoljára használt kulcs értéket id és egy hi értéket.
Ezek után Bob is megteszi ugyanezt. Figyeljük meg, hogy mivel kicsivel később kérte ki ugyanezt a két értéket ő id-nek már a hi értékkel növelt értéket kapja.
A hi érték mutatja, hogy mennyi kulcs generáláshoz használható információt kap meg a kliens, a lo érték pedig azt mutatja, hogy a kliens ezekből mennyit használt fel.
Amennyiben a kapott hi érték és a kliens lo értéke megegyezik, csak akkor kell ismételten a DB-hez fordulni kulcs generálási adatokhoz.
Ezzel az algoritmussal gyorsÃthatóak az Ãrási műveletek.
Használata
A Hi-Lo algoritmus DB függetlenül használható, ha mi magunk leimplementáljuk. Egy külön táblában tároljuk a tábla kulcsok utolsó értékét és a hi értéket, majd minden egyes kikéréskor frissÃtjük az indexet és ennek alapján épÃtjük fel a DB modellünket.
Azonban ha olyan DB-t használunk, ami beépÃtetten támogatja ezt, mint az SQL Server, akkor még egyszerűbb dolgunk van.
Csupán annyit kell tennünk, hogy az OnModelCreating metódusban létrehozunk egy Sequence tÃpust megadott névvel. SQL Server esetén a Sequence kifejezetten a Hi-Lo támogatásra használt tÃpus.
Ehhez a HasSequence metódust kell használnunk, aminek meg kell adni egy tÃpust, illetve egy nevet.
Ezt követÅ‘en pedig az entitásunk megadott tulajdonságát össze kell kapcsolnunk ezzel a tÃpussal a UseHiLo metódus segÃtségével:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(typeof(KonyvekContext).Assembly);
modelBuilder.HasSequence<int>("AuthorId").IncrementsBy(5);
modelBuilder.Entity<Author>().Property(a => a.Id).UseHiLo("AuthorId");
}
Az IncrementsBy a hi érték lesz. Ennek a számát érdemes az egyszerre párhuzamosan felvitt rekordok számának átlagához optimalizálni.