我在Java中使用System.currentTimeMillis()
(它返回一个long
整数)来为数据库实体生成一个唯一的ID,因为我认为这些时间在任何时候都不可能重叠。使用System.currentTimeMillis()来安全地生成唯一的数据库ID?
这是一个安全的假设吗?
例如,现在我得到这样的:
1296691225227
我在Java中使用System.currentTimeMillis()
(它返回一个long
整数)来为数据库实体生成一个唯一的ID,因为我认为这些时间在任何时候都不可能重叠。使用System.currentTimeMillis()来安全地生成唯一的数据库ID?
这是一个安全的假设吗?
例如,现在我得到这样的:
1296691225227
这是相当不可能的,你会得到一个冲突,是的(除非你是在高负载的系统,在这种情况下,它很可能),但仍有可能。
Java具有用于生成唯一标识符的现有机制,但是 - java.util.UUID
。它有方法来生成随机ID。
我强烈建议使用它。
不,这是不安全的。毫秒在CPU周期中是很长时间的(它们以每秒数十亿次循环运行,而不是数千次),所以如果一次有多个请求进来,或者如果多个线程都尝试创建数据库条目,它们将看到相同的CPU时间并且最终会碰撞钥匙。如果系统时钟以某种方式重置或更改时间较早,您也会遇到麻烦。
如果您的代码曾经在集群环境中运行,它会增加您碰到id冲突的几率。
大多数JPA数据库都有自己生成唯一ID的方法。
http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing
在失败的概率而言,我怀疑毫秒办法能够生存下去的单元测试。 – Dolph 2011-02-03 00:25:32
@Dolph - 或系统负载测试。当然,它不应该......如果你正在做它们。 – 2011-02-03 00:57:52