【发布时间】:2011-06-20 08:49:53
【问题描述】:
我在 Java 中使用 System.currentTimeMillis()(它返回一个 long 整数)为数据库实体生成唯一 ID,因为我认为这些时间不可能在任何时候重叠。
这是一个安全的假设吗?
例如,目前我得到这个:
1296691225227
【问题讨论】:
标签: java time uniqueidentifier
我在 Java 中使用 System.currentTimeMillis()(它返回一个 long 整数)为数据库实体生成唯一 ID,因为我认为这些时间不可能在任何时候重叠。
这是一个安全的假设吗?
例如,目前我得到这个:
1296691225227
【问题讨论】:
标签: java time uniqueidentifier
不,这不安全。一毫秒在 CPU 周期中是很长的时间(它们以每秒数十亿个周期而不是数千个周期运行),因此如果一次有多个请求或多个线程都尝试创建数据库条目,它们将看到相同的 CPU 时间和最终会发生碰撞键。如果系统时钟以某种方式被重置或更改为更早的时间,您也会遇到麻烦。
【讨论】:
您不太可能会发生冲突,是的(除非您处于高负载系统中,在这种情况下它非常很可能),但仍有可能。
不过,Java 有一个生成唯一标识符的现有机制 - java.util.UUID。它具有生成随机 ID 的方法。
我强烈建议改用它。
【讨论】:
long id 的高低方案。
如果您的代码曾经在集群环境中运行,则会增加您发生 id 冲突的几率。
大多数 JPA 数据库都有自己生成唯一 ID 的方法。
http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing
【讨论】: