科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道JAVA ID生成器

JAVA ID生成器

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

JAVA ID生成器

作者:gaven 来源:Matrix 2007年11月18日

关键字: ID生成器 java

  • 评论
  • 分享微博
  • 分享邮件
 

JAVA ID生成器

作者:gaven


版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
作者:gaven
地址:http://www.matrix.org.cn/resource/article/43/43894_JAVA_ID_Generator.html
关键词:JAVA ID 生成器

在一个数据库设计里,假如使用了逻辑主键,那么你一般都需要一个ID生成器去生成逻辑主键。

在许多数据库里面,都提供了ID生成的机制,如Oracle中的sequence,MSSQL中的identity,可惜这些方法各种数据库都不同的,所以很多人愿意找寻一种通用的方式。

编写代码,1、2、3……这样一直累加是最直接的想法,JAVA用以下方式去实现

  private static AtomicInteger uniqueId = new AtomicInteger(0);

  public static String nextId() {
    return Integer.toString(uniqueId.incrementAndGet());
  }

当然,这样太简单了,并且一重新启动,计数器就归 0 了,一般的做法可以用 时间 + 计数器 的方式,

  private static final long ONE_STEP = 10;
  private static final long BASE = 1129703383453l;

  private static final Lock LOCK = new ReentrantLock();

  private static long lastTime = System.currentTimeMillis();
  private static short lastCount = 0;


  /**
   * a time (as returned by {@link System#currentTimeMillis()}) at which
   * the VM that this <code>UID</code> was generated in was alive
   * @serial
   */
  private final long time;

  /**
   * 16-bit number to distinguish <code>UID</code> instances created
   * in the same VM with the same time value
   * @serial
   */
  private final short count;

  /**
   * Generates a <code>UID</code> that is unique over time with
   * respect to the host that it was generated on.
   */
  public UID() {
    LOCK.lock();
    try {
      if (lastCount == ONE_STEP) {
        boolean done = false;
        while (!done) {
          long now = System.currentTimeMillis();
          if (now == lastTime) {
            // pause for a second to wait for time to change
            try {
              Thread.currentThread().sleep(1);
            }
            catch (java.lang.InterruptedException e) {
            } // ignore exception
            continue;
          }
          else {
            lastTime = now;
            lastCount = 0;
            done = true;
          }
        }
      }
      time = lastTime;
      count = lastCount++;
    }
    finally {
      LOCK.unlock();
    }
  }

在一个群集的环境里面,通常还需要加上IP的前缀,即 IP + 时间 + 计数器,这个就是JAVA原版本的实现了。

但是,觉得这个ID太长了?那没办法,回到用数据库的方法吧。
查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章