在java中按顺序创建唯一的订单号?

时间:2014-04-06 09:41:20

标签: java

我需要为每个请求按顺序生成唯一的订单号。我需要确保即使在jvm重启后它应该是唯一的(我的意思是它应该在jvm崩溃之前不匹配任何数字)

最好我能想到使用数据库序列,它会按顺序给我唯一的数字。

java中是否有数据库序列的替代方法?

5 个答案:

答案 0 :(得分:2)

最好的办法是在数据库中保留该号码,特别是如果您可以扩展到多个服务器。但是,您可能会在单个服务器环境中使用以下内容:

public class UniqueSeq {

    private static final AtomicLong sequence = new AtomicLong(System.currentTimeMillis() / 1000);

    public static long getNext() {
        return sequence.incrementAndGet();
    }
}

答案 1 :(得分:2)

如果您可以访问以前生成的数字,则可以采用乐观的方式。比如说这是一个数据库,你可以做以下算法:

  1. 生成随机ID;
  2. 插入表格;
  3. 如果错误是" id已经存在",转到1;否则失败;
  4. 进行。
  5. 限制循环的重复次数;并改变策略。例如,以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或简单的文本文件来存储使用过的数字或最后一个索引(如果你'只是增加它。)