Frage

Im folgende Szenario:

1 Datenbank 4 Web-Server

Wie erzeuge die Webserver eindeutige IDs für die Datenbank, so dass sie einzigartig sind? Ja, es ist möglich, Auto-Zuwachs zu verwenden, aber das ist zu leicht gekrochen / erraten / etc. So Autoinkrement ist derzeit keine Option.

War es hilfreich?

Lösung

Verwenden Sie eine UUID ( http://www.ietf.org/rfc/rfc4122.txt ). Kollisionen sind unwahrscheinlich, und behandelt werden könnte, wenn sie auftreten, indem eine neue UUID zu regenerieren, oder sie könnten durch die Verkettung eine eindeutige ID für jeden Server (wie die MAC-Adresse) verhindert werden: -

StringBuilder sb = new StringBuilder(UUID.randomUUID());
InetAddress address = InetAddress.getLocalHost();
String uid = sb.append(NetworkInterface.getByInetAddress(address).getHardwareAddress());

Andere Tipps

Sie können eine UUID verwenden:

import java.util.UUID;        

UUID uuid = UUID.randomUUID();
System.out.println(uuid.toString());

Wenn Sie wirklich besorgt über Kollisionen sind, können Sie Ihre Schlüssel und speichert sie in einer Datenbank-Tabelle mit einem eindeutigen Index vorge erzeugen. Dann werfen Sie einen periodischen Job, der die Tabelle während der Ausfallzeit auffüllt und entfernt / Archiv Tasten hin und wieder verwendet wird.

Was DB-System verwenden Sie? Ist der App, welche Server die Anforderung macht? Entlassen Sie die DB den Schlüssel entscheiden, oder es in Code-Einstellung?

Es könnte so einfach sein wie ein Auto-Inkrement mit einem Präfix oder zweiten Feld, das den Server verwenden, die den Schlüssel angefordert werden.

Ich bin mir nicht sicher, warum ein Autoinkrement oder Sequenz nicht akzeptabel ist. Sie wollen eine interne ID nicht „erraten“ zu sein? Was, es ist so eine Kontonummer und Sie nicht möchten, dass jemand in der Lage sein eine gültige Kontonummer zu erraten?

Na ja, okay, außer UUIDs bereits erwähnt, zwei offensichtliche Möglichkeiten in den Sinn kommen.

  1. eine Sequenz verwenden, erzeugen dann eine Zufallszahl, und schaffen die Kontonummer aus einer Kombination der beiden, einen Algorithmus, so daß zwei unterschiedliche Sequenzen Nummern können nicht die gleiche Endzahl geben. Zum Beispiel wäre ein einfacher Algorithmus sein. Nehmen Sie die nächste Sequenznummer, multiplizieren 12345678, eine Zufallszahl von 0 bis 12345678-1, erzeugt und die beide zusammen fügt

  2. Haben Sie eine Tabelle auf der Datenbank mit einem Datensatz, der die zuletzt zugewiesene Nummer hält. Jedes Mal, wenn Sie eine neue Nummer benötigen, sperrt diesen Datensatz, verwenden Sie den vorherigen Wert den nächsten Wert zu erzeugen und den Datensatz zu aktualisieren. Solange die Zahlen immer erhöhen, sind Sie garantiert nicht ein Duplikat haben.

Wenn Sie einige Schema haben, die eine Kennung des Servers als Teil der Kennung verwendet, würde ich Sie ermutigen, nicht, dass die Kennung haben, einfach eine Zahl in einer Konfigurationsdatei irgendwo gespeichert sein. Ich arbeite jetzt in einem System, wo jemand auf die Idee hatte jedem Server über eine „Server-ID“ zu geben, die in gebaut wird ids aufzuzeichnen, und die Server-ID ist eine kleine ganze Zahl, die manuell zugewiesen wird. Es ist nicht allzu schwer, in der Produktion, wo es nur drei Servern. Aber in der Entwicklung und Tests, in denen neue Server kommen nach oben und unten die ganze Zeit und Test-Konfigurationsdateien werden ständig um geworfen werden, es ist ein Schmerz zu verwalten. Ich vermeide würde eine Server-ID Zeit nicht benutzen, aber wenn Sie vorhaben, eine verwenden, machen Sie sie von einem zentralen Server automatisch zugewiesen, oder es aus dem IP ableiten, oder etwas sicher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top