首页 > 学院 > 开发设计 > 正文

教你用JAVA ID生成器去生成逻辑主键

2019-11-18 12:37:15
字体:
来源:转载
供稿:网友

  在一个数据库设计里,假如使用了逻辑主键,那么你一般都需要一个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 UID was generated in was alive
  * @serial
  */
  private final long time;
  
  /**
  * 16-bit number to distinguish UID instances created
  * in the same VM with the same time value
  * @serial
  */
  private final short count;
  
  /**
  * Generates a UID 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太长了?那没办法,回到用数据库的方法吧。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表