Die Grundidee ist, dass Sie zwei Zahlen haben, um einen Primärschlüssel zu bilden - eine "hohe" und eine "niedrige" Zahl. Ein Client kann die "hohe" Sequenz grundsätzlich inkrementieren, da er weiß, dass er dann sicher Schlüssel aus dem gesamten Bereich des vorherigen "hohen" Werts mit der Vielzahl von "niedrigen" Werten generieren kann.
Angenommen, Sie haben eine "hohe" Sequenz mit einem aktuellen Wert von 35 und die "niedrige" Zahl liegt im Bereich von 0 bis 1023. Dann kann der Client die Sequenz auf 36 erhöhen (damit andere Clients Schlüssel generieren können, während er 35 verwendet) und wissen, dass die Schlüssel 35/0, 35/1, 35/2, 35/3 ... 35/1023 sind alles Verfügbar.
Es kann sehr nützlich sein (insbesondere bei ORMs), die Primärschlüssel auf der Clientseite festlegen zu können, anstatt Werte ohne Primärschlüssel einzufügen und sie dann wieder auf den Client abzurufen. Abgesehen von allem anderen, es heißt , Sie können leicht Eltern / Kind - Beziehungen machen und haben die alle Schlüssel vorhanden , bevor Sie tun alle Einsätze, die sie einfacher macht Dosieren.
Zusätzlich zu Jons Antwort:
Es wird verwendet, um getrennt arbeiten zu können. Ein Client kann dann den Server nach einer Hi-Nummer fragen und Objekte erstellen, die die Lo-Nummer selbst erhöhen. Der Server muss erst kontaktiert werden, wenn der Bereich lo aufgebraucht ist.
quelle
Die Hi / Lo-Algorithmen teilen die Sequenzdomäne in "Hi" -Gruppen auf. Ein "Hi" -Wert wird synchron zugewiesen. Jede "Hi" -Gruppe erhält eine maximale Anzahl von "Lo" -Einträgen, die offline zugewiesen werden können, ohne sich um gleichzeitige doppelte Einträge sorgen zu müssen.
Der Bezeichnerbereich wird durch die folgende Formel angegeben:
und der "lo" -Wert liegt im Bereich:
wird ab dem Startwert angewendet von:
Wenn alle "lo" -Werte verwendet werden, wird ein neuer "hi" -Wert abgerufen und der Zyklus fortgesetzt
Eine ausführlichere Erklärung finden Sie in diesem Artikel :
Und diese visuelle Präsentation ist auch leicht zu verfolgen:
Der Hi / Lo-Optimierer eignet sich zwar gut zur Optimierung der Bezeichnergenerierung, funktioniert jedoch nicht gut mit anderen Systemen, die Zeilen in unsere Datenbank einfügen, ohne etwas über unsere Bezeichnerstrategie zu wissen.
Hibernate bietet das Pool-Lo Optimierer, der die Vorteile der Hi / Lo-Generatorstrategie bietet und gleichzeitig Interoperabilität mit anderen Drittanbieter-Clients bietet, die diese Sequenzzuweisungsstrategie nicht kennen.
Der Pooled-Lo-Optimierer ist sowohl effizient als auch interoperabel mit anderen Systemen und ein viel besserer Kandidat als die bisherige Hi / Lo-Identifizierungsstrategie.
quelle
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "name") @SequenceGenerator(name="name", sequenceName = "name_seq", allocationSize=100)
für meine IDs., (hi * incrementSize) + 1)
... es sollte sein, hi * incrementSize)
, oder?Lo ist ein zwischengespeicherter Allokator, der den Schlüsselbereich in große Teile aufteilt, die normalerweise auf einer bestimmten Maschinenwortgröße basieren, und nicht auf den Bereichen mit sinnvoller Größe (z. B. 200 Schlüssel gleichzeitig), die ein Mensch möglicherweise sinnvoll auswählt.
Die Verwendung von Hi-Lo verschwendet beim Neustart des Servers in der Regel eine große Anzahl von Schlüsseln und generiert große, für den Menschen unfreundliche Schlüsselwerte.
Besser als der Hi-Lo-Allokator ist der Allokator "Linear Chunk". Dies verwendet ein ähnliches tabellenbasiertes Prinzip, weist jedoch kleine, zweckmäßig große Blöcke zu und generiert nette, menschenfreundliche Werte.
So weisen Sie beispielsweise die nächsten 200 Schlüssel zu (die dann als Bereich auf dem Server gespeichert und bei Bedarf verwendet werden):
Vorausgesetzt, Sie können diese Transaktion festschreiben (verwenden Sie Wiederholungsversuche, um Konflikte zu behandeln), haben Sie 200 Schlüssel zugewiesen und können diese nach Bedarf ausgeben.
Mit einer Blockgröße von nur 20 ist dieses Schema 10-mal schneller als die Zuweisung aus einer Oracle-Sequenz und zu 100% auf alle Datenbanken portierbar. Die Zuordnungsleistung entspricht Hi-Lo.
Im Gegensatz zu Amblers Idee wird der Schlüsselraum als zusammenhängende lineare Zahlenlinie behandelt.
Dies vermeidet den Anstoß für zusammengesetzte Schlüssel (die nie wirklich eine gute Idee waren) und vermeidet die Verschwendung ganzer Wörter beim Neustart des Servers. Es generiert "freundliche" Schlüsselwerte auf menschlicher Ebene.
Im Vergleich dazu weist die Idee von Herrn Ambler die hohen 16- oder 32-Bit-Werte zu und generiert große, für den Menschen unfreundliche Schlüsselwerte als Inkrement der Hi-Words.
Vergleich der zugewiesenen Schlüssel:
In Bezug auf das Design ist seine Lösung in der Zahlenreihe (zusammengesetzte Schlüssel, große Hi_word-Produkte) wesentlich komplexer als die von Linear_Chunk, ohne dass ein komparativer Vorteil erzielt wird.
Das Hi-Lo-Design entstand früh in der OO-Zuordnung und -Persistenz. Heutzutage bieten Persistenz-Frameworks wie Hibernate standardmäßig einfachere und bessere Allokatoren.
quelle
Ich fand, dass der Hi / Lo-Algorithmus perfekt für mehrere Datenbanken mit Replikationsszenarien ist, die meiner Erfahrung nach basieren. Stell dir das vor. Wenn Sie einen Server in New York (Alias 01) und einen anderen Server in Los Angeles (Alias 02) haben, haben Sie eine PERSON-Tabelle. Wenn also in New York eine Person erstellt wird, verwenden Sie immer 01 als HI-Wert und der LO-Wert ist der nächste Folgewert. Beispiel.
In Los Angeles verwenden Sie immer den HI 02. Zum Beispiel:
Wenn Sie also die Datenbankreplikation (unabhängig von der Marke) verwenden, lassen sich alle Primärschlüssel und Daten einfach und natürlich kombinieren, ohne sich um doppelte Primärschlüssel, Kollisionen usw. sorgen zu müssen.
Dies ist der beste Weg in diesem Szenario.
quelle