Sicher, System.currentTimeMillis () zu verwenden, um eine eindeutige Datenbank-ID zu generieren?

8

Ich verwende System.currentTimeMillis() (das eine long Ganzzahl zurückgibt) in Java, um eine eindeutige ID für Datenbank-Entities zu erzeugen, da ich annehme, dass diese Zeiten sich zu keinem Zeitpunkt überlappen können.

Ist das eine sichere Annahme?

Zum Beispiel, im Moment bekomme ich das:

%Vor%     
Silverstocking 03.02.2011, 00:12
quelle

3 Antworten

16

Nein, das ist nicht sicher. Eine Millisekunde ist eine lange Zeit in CPU-Zyklen (sie laufen bei Milliarden von Zyklen pro Sekunde, nicht bei Tausenden). Wenn mehrere Anfragen gleichzeitig eintreffen oder wenn mehrere Threads versuchen, Datenbankeinträge zu erstellen, sehen sie dieselbe CPU-Zeit und wird mit kollidierenden Schlüsseln enden. Sie hätten auch Probleme, wenn die Systemuhr irgendwie zurückgesetzt oder zu einem früheren Zeitpunkt geändert wurde.

    
templatetypedef 03.02.2011 00:14
quelle
8

Es ist ziemlich unwahrscheinlich, dass Sie einen Konflikt bekommen, ja (es sei denn, Sie sind in einem Hochlast-System, in diesem Fall ist es sehr wahrscheinlich), aber immer noch möglich.

Java hat einen Mechanismus zum Generieren von eindeutigen Bezeichnern, obwohl - java.util.UUID . Es hat Methoden, um zufällige IDs zu generieren.

Ich empfehle dringend, das stattdessen zu verwenden.

    
skaffman 03.02.2011 00:14
quelle
0

Wenn Ihr Code jemals in einer Clusterumgebung ausgeführt wird, erhöht sich die Wahrscheinlichkeit, dass Sie ID-Kollisionen haben.

Die meisten JPA-Datenbanken verfügen über Möglichkeiten, selbst eindeutige IDs zu generieren.

Ссылка

    
MeBigFatGuy 03.02.2011 05:01
quelle

Tags und Links