美文网首页
改写默认sharding-jdbc 3.0.0 的雪花算法

改写默认sharding-jdbc 3.0.0 的雪花算法

作者: simians | 来源:发表于2019-03-06 16:28 被阅读0次

    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;
        }
    

    相关文章

      网友评论

          本文标题:改写默认sharding-jdbc 3.0.0 的雪花算法

          本文链接:https://www.haomeiwen.com/subject/rxkxpqtx.html