2016-07-18 7 views
0

Ich brauche einen Servlet-Service zu machen, dass die Dinge sich folgendeServlets Erträge/generieren eindeutige Zeichenfolge

  1. wenn Benutzeranforderung des Service, Servlet generiert eine eindeutige 5 Buchstabenfolge, die nie erzeugt hat. (Kombination von 0 bis 9 und A ~ Z)

  2. , wenn der Benutzer sie akzeptiert, info speichern Benutzer die eindeutige Zeichenfolge verwendet (das # 1 erzeugt wird) als Primärschlüssel

Das erste, was tauchte in meinem Kopf war statische Klassenvariable, die um 1 erhöht als Anfragen Servlet, aber hier suchen und Google sagt, das ist wirklich sehr schlechte Idee, als ob mehrere Benutzer den Dienst zur gleichen Zeit treffen, wird es brechen ...

und jetzt bin ich ratlos, wonach ich schauen soll.

Was wäre der beste und sicherste Ansatz, um eine eindeutige Zeichenfolge inkrementell zu generieren?

Antwort

1

eine Feldsequenz no in der Tabelle und wann immer eine neue Anforderung kommt die höchste Sequenznummer aus der Datenbank erhalten und dann ein dh plus 1 addieren und speichern

+0

Wie man auch wissen will, welche Zahlen ausgeteilt werden, eine feste Lösung. –

+0

Würde dies nicht immer das gleiche Problem verursachen, wenn mehrere Benutzer gleichzeitig anfragen? Was passiert, wenn 2 oder mehr Benutzer auf die Anfrage zugreifen, bevor ich eine höhere inkrementierte Sequenz in der Tabelle verarbeite und speichere? – RedA

+0

@JoopEggen würden Sie in der Lage sein, etwas mehr im Detail zu erklären, wie diese Lösung das oben genannte Problem vermeiden wird? wenn mehrere Benutzer gleichzeitig anfragen? Sehr geschätzt im Voraus – RedA

0

Nach this site, Ihre höchste Zahl (ZZZZZ) ist 426088025. In der Datenbank-Welt möchten Sie eine Sequenz verwenden, aber aufgrund Ihrer Beschränkung auf 5 Zeichen müssen Sie sicherstellen, dass diese Zahl nicht überschritten wird (hoffentlich werden weniger als 426 Millionen Datensätze gespeichert).

Um eine Sequenz zu erstellen Sie so etwas wie tun werden:

create sequence your_sequence maxvalue 426088025 no cycle 

Das ist die PostgreSQL-Syntax ist - Ihre Datenbank variieren.

in Ihrem Code Dann können Sie eine

select nextval('your_sequence') 

tun, um Ihren Wert zu erhalten und dann kodieren Base64 diesen Wert. In PostgreSQL bedeutet der "keine Zyklus", dass wenn Sie das Maximum erreichen, wird ein Fehler ausgelöst.

In Java 8 wird Base64 enthalten:

import java.util.Base64; 

... 

String userNumber = Base64.getEncoder().encodeToString(Integer.toString(integerFromSequenceSelect)); 

Andernfalls, wenn Sie mit einer alten Version von Java stecken, Apache Commons Codec verwenden und läuft:

import org.apache.commons.codec.binary.Base64; 

... 

String userNumber = Base64.encodeBase64String(Integer.toString(integerFromSequenceSelect));