java id 生成器_JAVA ID生成器生成逻辑主键_java

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

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

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

private static AtomicInteger uniqueId = new AtomicInteger(0);

public static String nextId() {

http://www.gaodaima.com/64997.htmlJAVA ID生成器生成逻辑主键_java

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》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码

e7ce419cf2d6ad34d01da2ceb8829eed.png

微信 赏一包辣条吧~

023a57327877fb4402bcc76911ec18ea.png

支付宝 赏一听可乐吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值