Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1502466
  • 博文数量: 3500
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 43870
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-03 20:31
文章分类

全部博文(3500)

文章存档

2008年(3500)

我的朋友

分类:

2008-05-04 19:17:23

一起学习
在一个数据库设计里,假如使用了逻辑主键,那么你一般都需要一个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原版本的实现了。 下载本文示例代码


教你用JAVA ID生成器去生成逻辑主键教你用JAVA ID生成器去生成逻辑主键教你用JAVA ID生成器去生成逻辑主键教你用JAVA ID生成器去生成逻辑主键教你用JAVA ID生成器去生成逻辑主键教你用JAVA ID生成器去生成逻辑主键教你用JAVA ID生成器去生成逻辑主键教你用JAVA ID生成器去生成逻辑主键教你用JAVA ID生成器去生成逻辑主键教你用JAVA ID生成器去生成逻辑主键教你用JAVA ID生成器去生成逻辑主键教你用JAVA ID生成器去生成逻辑主键
阅读(247) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~