springboot集成shardingsphere

时间:2025-03-20 10:40:21

第一步.引入依赖
       

        <dependency>
            <groupId></groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId></groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- 使用原生druid池-->
        <dependency>
            <groupId></groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
        <dependency>
            <groupId></groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId></groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        


第二步.配置
 

spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    props:
      sql:
        show: true	# 开启sql日志输出
    datasource:	# 配置数据源
      names: demo0,demo1	# 分库的逻辑库名,可配置多个
      demo0:	# 逻辑库名
        type: 
        driver-class-name: 
        url: jdbc:mysql://127.0.0.1:3306/demo0?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: user
        password: password
      demo1:	# 逻辑库名
        type: 
        driver-class-name: 
        url: jdbc:mysql://127.0.0.1:3306/demo1?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: user
        password: password
    sharding:	
      tables: # 逻辑表名
        user: # 逻辑表名
          actual-data-nodes: demo$->{0..1}.user$->{0..1}
          table-strategy: # 分表策略
            inline:
              sharding-column: id	# 分片路由标准
              algorithm-expression: user$->{id % 2} # 分片算法表达式
          key-generator:
            column: id
            type: SNOWFLAKE
        order: # 逻辑表名
          actual-data-nodes: demo$->{0..1}.order$->{0..1}
          table-strategy: # 分表策略
            inline:
              sharding-column: id	# 分片路由标准
              algorithm-expression: order$->{id % 2} # 分片算法表达式
          key-generator:
            column: id
            type: SNOWFLAKE
      binding-tables: user
      default-database-strategy:	# 分库策略
        inline:
          sharding-column: id	# 分片路由标准
          algorithm-expression: demo${id % 2}	# 分库策略表达式 		* 注:此处配置demo${id % 2}而不是demo->${id % 2},因为(Collection<String> availableTargetNames, Collection<RouteValue> shardingValues)函数会解析策略表达式shardingValues为直接替换$变量进而匹配逻辑库名availableTargetNames

三.问题解决方案

1.数据库连接加载失败

          使用原始数据库连接池

2.加载数据库连接池报无法加载,已存在bean:

         启动类加入@EnableAutoConfiguration(exclude={})排除自动装载默认配置

3.整合shardingsphere后报algoric expression is required

         检查配置是否写错,可能是策略表达式配置问题导致

database 问题

         shardingsphere通过策略表达式无法匹配解析对应的逻辑数据库,则说明配置有问题,我遇到了一个-expression=demo$->id % 2}的问题

一开始参照官网,如上配置,但这是shardingsphere原生core包的配置,springboot-starter包我查看了源码:

public Collection<String> doSharding(Collection<String> availableTargetNames, Collection<RouteValue> shardingValues) {
        RouteValue shardingValue = (RouteValue)().next();
        (shardingValue instanceof ListRouteValue, "Inline strategy cannot support range sharding.");
        Collection<String> shardingResult = ((ListRouteValue)shardingValue);
        Collection<String> result = new TreeSet(String.CASE_INSENSITIVE_ORDER);
        Iterator var6 = ();

        while(()) {
            String each = (String)();
            if ((each)) {
                (each);
            }
        }

        return result;
    }

// 此方法做分片路由策略 

//availableTargetNames 表示逻辑表集合,shardingValues表示路由策略表达式解析后的策略集合

//只有当shardingValues的值在availableTargetNames中时,说明路由匹配成功,所以要完全匹配上才行

public Collection<String> doSharding(Collection<String> availableTargetNames, Collection<RouteValue> shardingValues) {
        RouteValue shardingValue = (RouteValue)().next();
        (shardingValue instanceof ListRouteValue, "Inline strategy cannot support range sharding.");
        Collection<String> shardingResult = ((ListRouteValue)shardingValue);
        Collection<String> result = new TreeSet(String.CASE_INSENSITIVE_ORDER);
        Iterator var6 = ();

        while(()) {
            String each = (String)();
            if ((each)) {
                (each);
            }
        }

        return result;
    }

最后修改demo->${id % 2}为demo${id % 2},最后问题解决