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 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原版本的实现了。