From b17c85e3aa1ce80bda36997cdca2dca62d82fcd6 Mon Sep 17 00:00:00 2001 From: gaohongtao Date: Wed, 15 Feb 2017 16:40:05 +0800 Subject: [PATCH] fix #225 ID's sequence can not reset to zero --- .../content/03-community/release-notes.md | 1 + .../id/generator/self/CommonSelfIdGenerator.java | 11 +---------- .../id/generator/self/CommonSelfIdGeneratorTest.java | 12 ++++-------- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/sharding-jdbc-doc/content/03-community/release-notes.md b/sharding-jdbc-doc/content/03-community/release-notes.md index 5ab94a1adead9..7f3cfd40f983d 100644 --- a/sharding-jdbc-doc/content/03-community/release-notes.md +++ b/sharding-jdbc-doc/content/03-community/release-notes.md @@ -20,6 +20,7 @@ next = "/03-community/directory-structure" 1. [ISSUE #212](https://github.com/dangdangdotcom/sharding-jdbc/issues/212) 对去缺少数据源规则给出更有意义的提示 1. [ISSUE #214](https://github.com/dangdangdotcom/sharding-jdbc/issues/214) where中 table_name.column_name in (?,?)无法解析表达式 1. [ISSUE #180](https://github.com/dangdangdotcom/sharding-jdbc/issues/180) 批量执行Update返回值不准确 +1. [ISSUE #225](https://github.com/dangdangdotcom/sharding-jdbc/issues/225) 自动生成Id最后一位不归零 ## 1.4.1 diff --git a/sharding-jdbc-id-generator-parent/sharding-jdbc-self-id-generator/src/main/java/com/dangdang/ddframe/rdb/sharding/id/generator/self/CommonSelfIdGenerator.java b/sharding-jdbc-id-generator-parent/sharding-jdbc-self-id-generator/src/main/java/com/dangdang/ddframe/rdb/sharding/id/generator/self/CommonSelfIdGenerator.java index 7e90e0a3c1b9e..ec950ac91e3d4 100644 --- a/sharding-jdbc-id-generator-parent/sharding-jdbc-self-id-generator/src/main/java/com/dangdang/ddframe/rdb/sharding/id/generator/self/CommonSelfIdGenerator.java +++ b/sharding-jdbc-id-generator-parent/sharding-jdbc-self-id-generator/src/main/java/com/dangdang/ddframe/rdb/sharding/id/generator/self/CommonSelfIdGenerator.java @@ -112,15 +112,6 @@ public static void setWorkerId(final Long workerId) { CommonSelfIdGenerator.workerId = workerId; } - /** - * 获取工作Id的二进制长度. - * - * @return 工作Id的二进制长度 - */ - public static long getWorkerIdLength() { - return WORKER_ID_BITS; - } - /** * 生成Id. * @@ -131,7 +122,7 @@ public synchronized Number generateId() { long time = clock.millis(); Preconditions.checkState(lastTime <= time, "Clock is moving backwards, last time is %d milliseconds, current time is %d milliseconds", lastTime, time); if (lastTime == time) { - if (0L == (++sequence & SEQUENCE_MASK)) { + if (0L == (sequence = ++sequence & SEQUENCE_MASK)) { time = waitUntilNextTime(time); } } else { diff --git a/sharding-jdbc-id-generator-parent/sharding-jdbc-self-id-generator/src/test/java/com/dangdang/ddframe/rdb/sharding/id/generator/self/CommonSelfIdGeneratorTest.java b/sharding-jdbc-id-generator-parent/sharding-jdbc-self-id-generator/src/test/java/com/dangdang/ddframe/rdb/sharding/id/generator/self/CommonSelfIdGeneratorTest.java index f9e50eb4e187e..def03a12168e1 100644 --- a/sharding-jdbc-id-generator-parent/sharding-jdbc-self-id-generator/src/test/java/com/dangdang/ddframe/rdb/sharding/id/generator/self/CommonSelfIdGeneratorTest.java +++ b/sharding-jdbc-id-generator-parent/sharding-jdbc-self-id-generator/src/test/java/com/dangdang/ddframe/rdb/sharding/id/generator/self/CommonSelfIdGeneratorTest.java @@ -61,20 +61,16 @@ public Long call() throws Exception { public void testMaxSequence() throws Exception { assertThat(maxId((1 << 12) - 1), is((1L << 12L) - 2)); assertThat(maxId(1 << 12), is((1L << 12L) - 1)); - assertThat(maxId((1 << 12) + 1), is((1L << 12L) - 1)); - assertThat(maxId(1 << 13), is((1L << 12L) - 1)); - assertThat(maxId((1 << 13) + 1), is((1L << 12L) - 1)); + assertThat(maxId((1 << 12) + 1), is(1L << 22)); } private long maxId(final int maxSequence) { CommonSelfIdGenerator idGenerator = new CommonSelfIdGenerator(); - CommonSelfIdGenerator.setClock(new FixClock(maxSequence)); + CommonSelfIdGenerator.setClock(new FixClock(1 << 13)); long id = 0; - long preId = 0; - while (id < (1L << 12)) { - preId = id; + for (int i = 0; i < maxSequence; i++) { id = (Long) idGenerator.generateId(); } - return preId; + return id; } }