我在Java中使用System.currentTimeMillis()
(返回一个long
整数)来为数据库实体生成一个唯一的ID,因为我认为这些时间在任何时候都不可能重叠。 / p>
这是一个安全的假设吗?
例如,目前我得到了这个:
1296691225227
答案 0 :(得分:16)
不,这不安全。一个毫秒是CPU周期中的长时间(它们以每秒数十亿个周期运行,而不是数千个),因此如果一次有多个请求进入,或者如果多个线程都尝试创建数据库条目,则它们将看到相同的CPU时间和将以碰撞键结束。如果系统时钟以某种方式重置或更改为较早时间,您也会遇到麻烦。
答案 1 :(得分:10)
你不太可能发生冲突,是的(除非你处于高负荷系统,在这种情况下它可能非常),但仍有可能。
Java有一种现有的生成唯一标识符的机制 - java.util.UUID
。它有生成随机ID的方法。
我强烈建议改用它。
答案 2 :(得分:0)
如果您的代码在群集环境中运行,则会增加您发生ID冲突的几率。
大多数JPA数据库都有自行生成唯一ID的方法。
http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing