Einmal HiLo im Einsatz ist, was passiert, wenn Sie ändern die Kapazität (maximale Lo)?
Wenn ich mit einer HiLo-generator zum zuordnen-ID für eine Tabelle, und entscheiden Sie dann, zu erhöhen oder verringern die Kapazität (d.h. die maximale " lo "- Wert), wird dies zu Kollisionen mit den bereits zugewiesenen ID ' s???
Ich Frage mich nur, ob ich eine große rote fahne um die Zahl zu sagen " bloß nicht verändern!'
Hinweis - nicht NHibernate bestimmtes, ich bin einfach nur neugierig über die HiLo-Algorithmus im Allgemeinen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
HiLo-algorithmen im Allgemeinen grundsätzlich map zwei integers zu einer integer-ID. Es garantiert, dass die paar zahlen werden eindeutig pro Datenbank. In der Regel, der nächste Schritt ist, zu garantieren, dass ein eindeutiges paar von zahlen, die Karten zu einer eindeutigen integer-ID.
Eine schöne Erklärung, wie HiLo konzeptionell arbeitet, ist in diese frühere SO beantworten
Änderung der max_lo bewahrt die Eigenschaft, dass Sie Ihr paar von zahlen, die einzigartig sein wird. Allerdings wird es sicherzustellen, dass die zugeordnete ID ist eindeutig und kollisionsfrei?
Schauen wir uns Hibernate-Implementierung von HiLo. Der Algorithmus erscheinen Sie zu verwenden (als von dem, was ich gesammelt habe) ist: (und ich könnte aus sein auf eine Formsache)
Wenn Ihr also einen niedrigen block ist, sagen wir, 100 Ihre reservierte Blöcke ID gehen würde, 1-100, 101-200, 201-300, 301-400...
Ihre Hohe Sequenz ist jetzt 3. Nun, was würde passieren, wenn Sie plötzlich geändert haben Ihre l_size 10? Ihre nächsten block, High erhöht wird, und Sie möchten Holen Sie sich
4*10+1 = 41
Oops. Dieser neue Wert fällt definitiv in den "reserved block" von
1-100
. Jemand mit einer hohen Folge von 0 würde denken, "Nun, ich habe die Palette1-100
reserviert nur für mich, so dass ich nur legte eine auf41
, weil ich weiß, dass es sicher ist."Es ist definitiv eine sehr, sehr hohe Wahrscheinlichkeit einer Kollision, wenn Tieferlegung Ihre l_max.
Was ist mit dem umgekehrten Fall, das heben?
Zurück zu unserem Beispiel, lasst uns erheben unsere l_size zu 500, drehen Sie die nächste Taste, die in
4*500+1 = 2001
, die Reservierung der Bandbreite 2001-2501.Sieht es aus wie Kollisionen vermieden werden, in dieser besonderen Umsetzung von HiLo, wenn Erhöhung Ihre l_max.
Natürlich, sollten Sie einige tests auf Ihre eigenen zu machen sicher, dass dies der tatsächlichen Umsetzung, oder um es zu schließen. Eine Möglichkeit wäre, um l_max auf 100 und die ersten paar Tasten, dann die 500 und die nächste. Wenn es einen riesigen Sprung, wie hier bereits erwähnt, Sie könnte sicher sein.
Allerdings bin ich mir nicht durch irgendwelche Mittel, was darauf hindeutet, dass es ist die beste Praxis zu erhöhen, Ihre l_max auf einer vorhandenen Datenbank.
Verwenden Sie Ihre eigenen Ermessen; die HiLo-Algorithmus ist nicht gerade eins gemacht mit unterschiedlichen l_max im Sinn, und Ihre Ergebnisse können am Ende unberechenbar sind abhängig von Ihrer exakten Implementierung. Vielleicht hat jemand schon Erfahrung mit der Aufzucht Ihrer l_max und finden sorgen können, beweisen diese Zählung korrekt.
So zum Schluss, auch wenn in der Theorie, Hibernate ' s HiLo Umsetzung wird wahrscheinlich Kollisionen zu vermeiden, wenn l_max ausgelöst wird, ist es wahrscheinlich immer noch nicht gute Praxis. Sollten Sie code wie wenn l_max wurden nicht im Laufe der Zeit ändern.
Aber wenn Sie sich glücklich fühlen...
Sehen Sie die Lineare Chunk-Tabelle Zuweisung -- logisch ist dies ein einfacher & richtige Ansatz, um das gleiche problem.
Was ist der Hi/Lo-Algorithmus?
Durch die Zuweisung reicht aus der Reihe Raum & Vertretung der
NEXT
direkt, eher als kompliziert, die Logik mit hohen Worten oder zahlen multipliziert, kannst du direkt sehen, welche Schlüssel werden generiert.Im wesentlichen "Linear Chunk-Zuweisung" verwendet neben eher als Multiplikation. Wenn die NÄCHSTEN 1000 & wir haben konfiguriert-range-Größe von 20, WEITER voranzutreiben, um 1020, und wir werden halten Sie die Tasten 1000-1019 für die Zuteilung.
Range-Größe abgestimmt werden können oder jederzeit neu konfiguriert, ohne Verlust der Integrität. Es gibt eine direkte Beziehung zwischen dem NÄCHSTEN Feld der Zuweisung, die generierten keys & MAX(ID) in der Tabelle.
Vergleich, "Hi-Lo" verwendet Multiplikation. Wenn die nächsten 50 & der Multiplikator ist 20, dann bist du die Zuweisung Tasten rund um die 1000-1019. Es gibt keine direkte Korrelation zwischen NÄCHSTEN, generiert Schlüssel & MAX(ID) in der Tabelle, ist es schwierig, passen Sie als NÄCHSTES sicher, und der Multiplikator kann nicht verändert werden, ohne störenden aktuelle Allokation Punkt).
Mit "Linear Chunk" können Sie konfigurieren, wie groß jedes Angebot/chunk-Größe 1 entspricht der traditionellen Tisch-basierte "single-Zuweisung" & hits der Datenbank zu generieren, jede Taste, die Größe 10 ist 10-mal schneller als es reserviert einen Bereich von 10 auf einmal, die Größe von 50 oder 100 ist noch schneller..
Einer Größe von 65536 generiert hässlich aussehende Tasten, verschwendet riesige Mengen von keys auf dem server neu starten, und ist äquivalent zu Scott Ambler original-HI-LO-Algorithmus.
In kurz -, Hi-Lo ist eine irrtümlich komplexe & fehlerhafte Ansatz zu dem, was gewesen sein sollte begrifflich trivial einfach-die Zuweisung erstreckt sich entlang einer Reihe Linie.
Ich versuchte Sie auszugraben behviour von HiLo algorith durch eine einfache helloWrold-ish hibernate-Anwendung.
Ich habe versucht, einen Ruhezustand Beispiel mit
Tabelle mit dem Namen "HILO_TABLE" erstellt, mit single-Spalte "TEST_HILO"
Anfangs habe ich mir eingestellten Wert von TEST_HILO Spalte 8.
Habe ich beobachtet, dass das Muster zu erstellen, die ID ist
hivalue ist die Spalte value in DB (D. H. wählen Sie TEST_HILO von HILO_TABLE )
lowvalue ist von config-xml (40 )
so, in diesem Fall-IDs gestartet 8*40 + 8 = 328
In meinem hibernate Beispiel fügte ich 200 Zeilen in einer Sitzung. also die Zeilen wurden erstellt mit IDs 328 527
Und in DB hivalue wurde erhöht, bis 13.
Die increment Logik scheint zu sein :-
= 8 + 200/40 = 8 + 5 =13
Nun, wenn ich ausführen gleichen hibernate-Programm zum einfügen von Zeilen, die IDs starten sollten
13*40 + 13 = 533
Wenn das Programm ausgeführt haben, es wurde bestätigt.
Nur durch Erfahrung würde ich sagen: ja, die Verringerung wird zu Kollisionen. Wenn Sie einen niedrigeren max gering, Sie erhalten niedrigere Nummern, unabhängig von der hohe Wert in der Datenbank (die auf die gleiche Weise behandelt, wie zB. Inkrement bei jeder session factory-Instanz im Fall der NH).
Gibt es eine chance, dass die Erhöhung nicht zu Kollisionen. Aber Sie müssen entweder versuchen oder jemanden Fragen der sich besser auskennt dann ich tun, um sicher zu sein.