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%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.
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.
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.
Tags und Links java time uniqueidentifier