Безопасно ли использовать System.currentTimeMillis () для создания уникального идентификатора базы данных? - PullRequest
10 голосов
/ 03 февраля 2011

Я использую System.currentTimeMillis() (который возвращает long целое число) в Java для генерации уникального идентификатора для объектов базы данных, поскольку я предполагаю, что в это время невозможно перекрываться в любой момент.* Это безопасное предположение?

Например, на данный момент я получаю это:

1296691225227

Ответы [ 3 ]

16 голосов
/ 03 февраля 2011

Нет, это не безопасно. Миллисекунда - это длительное время в циклах ЦП (они выполняются с миллиардами циклов в секунду, а не тысячами), поэтому, если одновременно поступает несколько запросов или если все потоки пытаются создать записи в базе данных, они увидят одинаковое время ЦП и закончится столкновением ключей. У вас также могут возникнуть проблемы, если системные часы каким-то образом будут сброшены или переведены на более раннее время.

10 голосов
/ 03 февраля 2011

Маловероятно, что вы получите столкновение, да (если только вы не в системе с высокой нагрузкой, в этом случае это очень вероятно), но все же возможно.

В Java уже существует механизм генерации уникальных идентификаторов - java.util.UUID. У него есть методы для генерации случайных идентификаторов.

Я настоятельно рекомендую использовать это вместо.

0 голосов
/ 03 февраля 2011

Если ваш код когда-либо выполняется в кластерной среде, это увеличивает вероятность того, что у вас возникнут конфликты идентификаторов.

В большинстве баз данных JPA есть способы для генерации уникальных идентификаторов.

http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...