sharding-jdbc 最新官网
sharding-jdbc 3.0.0雪花算法存在一个问题,就是在并发量不高的情况下生成的id有大部分为偶数,这就造成了一个问题,基数表几乎不会写进去数据,偶数表压力会很大。
更新:sharding-jdbc 3.1.0 更新后该问题解决
解决方法就是去掉一个判断(但是不了解会不会影响其性能)
参考csdn作者: wzz_java
改写前
public synchronized Number generateKey() {
long currentMillis = timeService.getCurrentMillis();
Preconditions.checkState(this.lastTime <= currentMillis, "Clock is moving backwards, last time is %d milliseconds, current time is %d milliseconds", new Object[]{this.lastTime, currentMillis});
if (this.lastTime == currentMillis) {//将他去掉
if (0L == (this.sequence = this.sequence + 1L & 4095L)) {
currentMillis = this.waitUntilNextTime(currentMillis);
}
} else {//将他去掉
this.sequence = 0L;
}
this.lastTime = currentMillis;
return currentMillis - EPOCH << 22 | workerId << 12 | this.sequence;
}
改写后
由于默认的类是 fianl 的 所以可以直接创建一个新类来进行改写(本来打算重写 该方法来着。。。)
public synchronized long getGeneratorKey(){
//获取系统当前时间戳
long currentMillis = System.currentTimeMillis();
//检查时间 如果时间小于 最新时间则抛出传参异常
Preconditions.checkState(this.lastTime <= currentMillis, "Clock is moving backwards, last time is %d milliseconds, current time is %d milliseconds", new Object[]{this.lastTime, currentMillis});
if (0L == (this.sequence = this.sequence + 1L & SEQUENCE_MASK)) {
currentMillis = this.waitUntilNextTime(currentMillis);
}
this.lastTime = currentMillis;
//当前时间-起始时间 左移22位 wokerId 左移10位 后 三者做或运算 00为0 01为1 11位1 10未1
return currentMillis - EPOCH << TIMESTAMP_LEFT_SHIFT_BITS | workerId << WORKER_ID_LEFT_SHIFT_BITS | this.sequence;
}
网友评论