我在 Java 中使用 System.currentTimeMillis()
(返回一个 long
整数)来生成数据库实体的唯一 ID,因为我认为,在任何时候这些时间戳不能重叠。
这是一个安全的假设吗?
例如,目前我得到了以下时间戳:
1296691225227
我在 Java 中使用 System.currentTimeMillis()
(返回一个 long
整数)来生成数据库实体的唯一 ID,因为我认为,在任何时候这些时间戳不能重叠。
这是一个安全的假设吗?
例如,目前我得到了以下时间戳:
1296691225227
不,这样是不安全的。在CPU周期中,一毫秒的时间很长(它们每秒运行数十亿个周期,而不是数千个),因此如果同时发出多个请求或多个线程都尝试创建数据库条目,则它们将看到相同的CPU时间,并且会导致键冲突。如果系统时钟被重置或更改为早期时间,也会遇到麻烦。
很有可能不会出现冲突(除非您在高负载系统中,在这种情况下,冲突的可能性非常高),但仍然有可能。
Java已经有了生成唯一标识符的机制 - java.util.UUID
。 它有方法可以生成随机ID。
我强烈建议使用它来代替。
long
类型的id来解决这个问题。 - bestsss如果您的代码在集群环境中运行,那么发生ID冲突的可能性会增加。
大多数JPA数据库都有自己生成唯一ID的方法。
http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing