我需要为每个请求按顺序生成唯一的订单号。我需要确保即使在jvm重启后它应该是唯一的(我的意思是它应该在jvm崩溃之前不匹配任何数字)
最好我能想到使用数据库序列,它会按顺序给我唯一的数字。
java中是否有数据库序列的替代方法?
答案 0 :(得分:2)
最好的办法是在数据库中保留该号码,特别是如果您可以扩展到多个服务器。但是,您可能会在单个服务器环境中使用以下内容:
public class UniqueSeq {
private static final AtomicLong sequence = new AtomicLong(System.currentTimeMillis() / 1000);
public static long getNext() {
return sequence.incrementAndGet();
}
}
答案 1 :(得分:2)
如果您可以访问以前生成的数字,则可以采用乐观的方式。比如说这是一个数据库,你可以做以下算法:
限制循环的重复次数;并改变策略。例如,以max id为100开始; 3次尝试后,如果失败,加注到1000;然后10000;这个最大数量也可以存储在数据库中。
答案 2 :(得分:1)
您可以查看广告java UUID generator,生成唯一数字应该是安全的
如果您需要在生成之后检索值,我认为使用db解决方案是最佳选择,因此您可以将它们保存到db
答案 3 :(得分:1)
保证唯一性的唯一方法是保持“唯一编号生成器”的状态,这样即使重新启动JVM或启动多个JVM,也不会选择以前使用的数字。
最简单的方法是将unqieu数字生成委托给数据库。或者,您可以按顺序生成数字并将最后一个数字存储在文件中(但由于潜在的数据竞争,您需要正确锁定文件)。
如果偶然(但概率很低)碰撞没问题,你可以使用UUID(UUID通常使用时间戳,因此如果两个JVM的时钟没有同步,则可能会选择相同的ID两次。)
答案 4 :(得分:0)
根据用例,当前时间戳(以毫秒为单位)也可以使用?我知道这可能会返回两次相同的数字,所以这个解决方案实际上取决于用例。
如果时间戳不起作用,并且因为即使在JVM重新启动后您需要一个唯一的数字,您还需要某种持久性,如DB或简单的文本文件来存储使用过的数字或最后一个索引(如果你'只是增加它。)