| @@ -97,7 +97,42 @@ | |||||
| </project> | </project> | ||||
| ``` | ``` | ||||
| ### 2.2. `DataSourceShardingConfig.java` | |||||
| ### 2.2. `CustomSnowflakeKeyGenerator.java` | |||||
| ```java | |||||
| package com.xkcoding.sharding.jdbc.config; | |||||
| import cn.hutool.core.lang.Snowflake; | |||||
| import io.shardingsphere.core.keygen.KeyGenerator; | |||||
| /** | |||||
| * <p> | |||||
| * 自定义雪花算法,替换 DefaultKeyGenerator,避免DefaultKeyGenerator生成的id大几率是偶数 | |||||
| * </p> | |||||
| * | |||||
| * @package: com.xkcoding.sharding.jdbc.config | |||||
| * @description: 自定义雪花算法,替换 DefaultKeyGenerator,避免DefaultKeyGenerator生成的id大几率是偶数 | |||||
| * @author: yangkai.shen | |||||
| * @date: Created in 2019-03-26 17:07 | |||||
| * @copyright: Copyright (c) 2019 | |||||
| * @version: V1.0 | |||||
| * @modified: yangkai.shen | |||||
| */ | |||||
| public class CustomSnowflakeKeyGenerator implements KeyGenerator { | |||||
| private Snowflake snowflake; | |||||
| public CustomSnowflakeKeyGenerator(Snowflake snowflake) { | |||||
| this.snowflake = snowflake; | |||||
| } | |||||
| @Override | |||||
| public Number generateKey() { | |||||
| return snowflake.nextId(); | |||||
| } | |||||
| } | |||||
| ``` | |||||
| ### 2.3. `DataSourceShardingConfig.java` | |||||
| ```java | ```java | ||||
| /** | /** | ||||
| @@ -115,6 +150,8 @@ | |||||
| */ | */ | ||||
| @Configuration | @Configuration | ||||
| public class DataSourceShardingConfig { | public class DataSourceShardingConfig { | ||||
| private static final Snowflake snowflake = IdUtil.createSnowflake(1, 1); | |||||
| /** | /** | ||||
| * 需要手动配置事务管理器 | * 需要手动配置事务管理器 | ||||
| */ | */ | ||||
| @@ -149,7 +186,7 @@ public class DataSourceShardingConfig { | |||||
| // ds${0..1}.t_order_${0..2} 也可以写成 ds$->{0..1}.t_order_$->{0..1} | // ds${0..1}.t_order_${0..2} 也可以写成 ds$->{0..1}.t_order_$->{0..1} | ||||
| tableRule.setActualDataNodes("ds${0..1}.t_order_${0..2}"); | tableRule.setActualDataNodes("ds${0..1}.t_order_${0..2}"); | ||||
| tableRule.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_$->{order_id % 3}")); | tableRule.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_$->{order_id % 3}")); | ||||
| tableRule.setKeyGenerator(new DefaultKeyGenerator()); | |||||
| tableRule.setKeyGenerator(customKeyGenerator()); | |||||
| tableRule.setKeyGeneratorColumnName("order_id"); | tableRule.setKeyGeneratorColumnName("order_id"); | ||||
| return tableRule; | return tableRule; | ||||
| } | } | ||||
| @@ -176,6 +213,13 @@ public class DataSourceShardingConfig { | |||||
| return dataSourceMap; | return dataSourceMap; | ||||
| } | } | ||||
| /** | |||||
| * 自定义主键生成器 | |||||
| */ | |||||
| private KeyGenerator customKeyGenerator() { | |||||
| return new CustomSnowflakeKeyGenerator(snowflake); | |||||
| } | |||||
| } | } | ||||
| ``` | ``` | ||||
| @@ -0,0 +1,30 @@ | |||||
| package com.xkcoding.sharding.jdbc.config; | |||||
| import cn.hutool.core.lang.Snowflake; | |||||
| import io.shardingsphere.core.keygen.KeyGenerator; | |||||
| /** | |||||
| * <p> | |||||
| * 自定义雪花算法,替换 DefaultKeyGenerator,避免DefaultKeyGenerator生成的id大几率是偶数 | |||||
| * </p> | |||||
| * | |||||
| * @package: com.xkcoding.sharding.jdbc.config | |||||
| * @description: 自定义雪花算法,替换 DefaultKeyGenerator,避免DefaultKeyGenerator生成的id大几率是偶数 | |||||
| * @author: yangkai.shen | |||||
| * @date: Created in 2019-03-26 17:07 | |||||
| * @copyright: Copyright (c) 2019 | |||||
| * @version: V1.0 | |||||
| * @modified: yangkai.shen | |||||
| */ | |||||
| public class CustomSnowflakeKeyGenerator implements KeyGenerator { | |||||
| private Snowflake snowflake; | |||||
| public CustomSnowflakeKeyGenerator(Snowflake snowflake) { | |||||
| this.snowflake = snowflake; | |||||
| } | |||||
| @Override | |||||
| public Number generateKey() { | |||||
| return snowflake.nextId(); | |||||
| } | |||||
| } | |||||
| @@ -1,11 +1,13 @@ | |||||
| package com.xkcoding.sharding.jdbc.config; | package com.xkcoding.sharding.jdbc.config; | ||||
| import cn.hutool.core.lang.Snowflake; | |||||
| import cn.hutool.core.util.IdUtil; | |||||
| import com.zaxxer.hikari.HikariDataSource; | import com.zaxxer.hikari.HikariDataSource; | ||||
| import io.shardingsphere.api.config.rule.ShardingRuleConfiguration; | import io.shardingsphere.api.config.rule.ShardingRuleConfiguration; | ||||
| import io.shardingsphere.api.config.rule.TableRuleConfiguration; | import io.shardingsphere.api.config.rule.TableRuleConfiguration; | ||||
| import io.shardingsphere.api.config.strategy.InlineShardingStrategyConfiguration; | import io.shardingsphere.api.config.strategy.InlineShardingStrategyConfiguration; | ||||
| import io.shardingsphere.api.config.strategy.NoneShardingStrategyConfiguration; | import io.shardingsphere.api.config.strategy.NoneShardingStrategyConfiguration; | ||||
| import io.shardingsphere.core.keygen.DefaultKeyGenerator; | |||||
| import io.shardingsphere.core.keygen.KeyGenerator; | |||||
| import io.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory; | import io.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory; | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.context.annotation.Bean; | import org.springframework.context.annotation.Bean; | ||||
| @@ -35,6 +37,8 @@ import java.util.concurrent.ConcurrentHashMap; | |||||
| */ | */ | ||||
| @Configuration | @Configuration | ||||
| public class DataSourceShardingConfig { | public class DataSourceShardingConfig { | ||||
| private static final Snowflake snowflake = IdUtil.createSnowflake(1, 1); | |||||
| /** | /** | ||||
| * 需要手动配置事务管理器 | * 需要手动配置事务管理器 | ||||
| */ | */ | ||||
| @@ -69,7 +73,7 @@ public class DataSourceShardingConfig { | |||||
| // ds${0..1}.t_order_${0..2} 也可以写成 ds$->{0..1}.t_order_$->{0..1} | // ds${0..1}.t_order_${0..2} 也可以写成 ds$->{0..1}.t_order_$->{0..1} | ||||
| tableRule.setActualDataNodes("ds${0..1}.t_order_${0..2}"); | tableRule.setActualDataNodes("ds${0..1}.t_order_${0..2}"); | ||||
| tableRule.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_$->{order_id % 3}")); | tableRule.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_$->{order_id % 3}")); | ||||
| tableRule.setKeyGenerator(new DefaultKeyGenerator()); | |||||
| tableRule.setKeyGenerator(customKeyGenerator()); | |||||
| tableRule.setKeyGeneratorColumnName("order_id"); | tableRule.setKeyGeneratorColumnName("order_id"); | ||||
| return tableRule; | return tableRule; | ||||
| } | } | ||||
| @@ -96,4 +100,11 @@ public class DataSourceShardingConfig { | |||||
| return dataSourceMap; | return dataSourceMap; | ||||
| } | } | ||||
| /** | |||||
| * 自定义主键生成器 | |||||
| */ | |||||
| private KeyGenerator customKeyGenerator() { | |||||
| return new CustomSnowflakeKeyGenerator(snowflake); | |||||
| } | |||||
| } | } | ||||