ShardingJdbc配置说明

2025-12-12 0 418

ShardingJdbc配置说明

ShardingJdbc是ShardingSphere生态中的轻量级分库分表解决方案,它通过JDBC层拦截SQL语句,实现对底层数据库的分片访问。下面详细介绍ShardingJdbc的主要配置项和配置方法。

1. 基础依赖配置

首先,需要在Maven项目中添加ShardingJdbc的依赖:


<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.2.1</version>
</dependency>
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.33</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

2. 数据源配置

在application.yml或application.properties中配置数据源:

spring:
  shardingsphere:
    datasource:
      names: db0,db1  # 数据源名称列表
      # 第一个数据源配置
      db0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/db0?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
      # 第二个数据源配置
      db1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root

3. 分片规则配置

3.1 表分片配置

spring:
  shardingsphere:
    rules:
      sharding:
        tables:
          # 表名
          orders:
            # 实际数据节点,格式:数据源名称.表名
            actual-data-nodes: db${0..1}.orders_${0..3}
            # 分库策略
            database-strategy:
              standard:
                sharding-column: user_id  # 分片列
                sharding-algorithm-name: database-inline  # 分片算法名称
            # 分表策略
            table-strategy:
              standard:
                sharding-column: order_id  # 分片列
                sharding-algorithm-name: table-inline  # 分片算法名称
            # 主键生成策略
            key-generate-strategy:
              column: order_id  # 主键列
              key-generator-name: snowflake  # 主键生成算法

3.2 绑定表配置

当两个表之间存在外键关联关系时,可以配置为绑定表,以优化查询性能:

spring:
  shardingsphere:
    rules:
      sharding:
        binding-tables:
          - orders,order_items  # 绑定表组,多个表用逗号分隔

3.3 广播表配置

广播表是指在所有分片数据源中都存在的表,表结构和数据完全相同:

spring:
  shardingsphere:
    rules:
      sharding:
        broadcast-tables:
          - t_config  # 广播表名
          - t_dict    # 多个广播表

4. 分片算法配置

ShardingJdbc支持多种分片算法,以下是常见的几种:

4.1 内联分片算法

spring:
  shardingsphere:
    rules:
      sharding:
        sharding-algorithms:
          # 数据库分片算法
          database-inline:
            type: INLINE
            props:
              algorithm-expression: db${user_id % 2}
          # 表分片算法
          table-inline:
            type: INLINE
            props:
              algorithm-expression: orders_${order_id % 4}

4.2 范围分片算法

spring:
  shardingsphere:
    rules:
      sharding:
        sharding-algorithms:
          range-sharding:
            type: INTERVAL
            props:
              datetime-pattern: yyyy-MM-dd
              datetime-lower: 2020-01-01
              datetime-upper: 2025-12-31
              sharding-suffix-pattern: \'yyyyMM\'
              datetime-interval-unit: MONTHS
              datetime-interval-amount: 1

4.3 哈希分片算法

spring:
  shardingsphere:
    rules:
      sharding:
        sharding-algorithms:
          hash-sharding:
            type: HASH_MOD
            props:
              sharding-count: 4

4.4 时间分片算法

spring:
  shardingsphere:
    rules:
      sharding:
        sharding-algorithms:
          time-sharding:
            type: CLASS_BASED
            props:
              strategy: STANDARD
              algorithmClassName: com.example.TimeShardingAlgorithm  # 自定义分片算法类

5. 主键生成策略配置

spring:
  shardingsphere:
    rules:
      sharding:
        key-generators:
          # 雪花算法
          snowflake:
            type: SNOWFLAKE
            props:
              worker-id: 1
          # UUID
          uuid:
            type: UUID
            props:
              max-length: 36

6. 读写分离配置

spring:
  shardingsphere:
    rules:
      readwrite-splitting:
        data-sources:
          ds_group_0:
            write-data-source-name: db0
            read-data-source-names: db0_slave0, db0_slave1
            load-balancer-name: random  # 负载均衡算法
        load-balancers:
          random:
            type: RANDOM

7. 公共配置项

spring:
  shardingsphere:
    # SQL显示配置
    props:
      sql:
        show: true  # 是否显示SQL
      # 执行模式配置
      executor:
        size: 20  # 执行线程池大小
      # 检查项配置
      check:
        table:
          metadata: true  # 是否检查表元数据

8. 分布式事务配置

ShardingJdbc支持XA事务和SAGA事务:

spring:
  shardingsphere:
    rules:
      transaction:
        default-type: XA  # 事务类型,可选XA、BASE
        providers:
          xa:
            type: Atomikos  # XA事务管理器
          saga:
            type: Seata  # SAGA事务管理器

9. 自定义分片算法实现

如果内置的分片算法不能满足需求,可以实现自定义分片算法:

public class CustomShardingAlgorithm implements StandardShardingAlgorithm {
    
    @Override
    public String doSharding(Collection availableTargetNames, PreciseShardingValue shardingValue) {
        // 实现精确分片逻辑
        Long value = shardingValue.getValue();
        String tableName = \"orders_\" + (value % 4);
        for (String targetName : availableTargetNames) {
            if (targetName.endsWith(tableName)) {
                return targetName;
            }
        }
        throw new UnsupportedOperationException();
    }
    
    @Override
    public Collection doSharding(Collection availableTargetNames, RangeShardingValue shardingValue) {
        // 实现范围分片逻辑
        Collection result = new LinkedHashSet();
        Range range = shardingValue.getValueRange();
        for (Long i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {
            String tableName = \"orders_\" + (i % 4);
            for (String targetName : availableTargetNames) {
                if (targetName.endsWith(tableName)) {
                    result.add(targetName);
                }
            }
        }
        return result;
    }
    
    @Override
    public void init() {
        // 初始化方法
    }
    
    @Override
    public String getType() {
        return \"CUSTOM\";  // 算法类型
    }
}

10. 配置示例(完整)

spring:
  shardingsphere:
    datasource:
      names: db0,db1,db0_slave0,db0_slave1
      # 主库配置
      db0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/db0?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
      db1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
      # 从库配置
      db0_slave0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3307/db0?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
      db0_slave1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3308/db0?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
    
    rules:
      # 分片规则
      sharding:
        tables:
          orders:
            actual-data-nodes: ds_group_${0}.orders_${0..3}
            database-strategy:
              standard:
                sharding-column: user_id
                sharding-algorithm-name: database-inline
            table-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: table-inline
            key-generate-strategy:
              column: order_id
              key-generator-name: snowflake
          order_items:
            actual-data-nodes: ds_group_${0}.order_items_${0..3}
            database-strategy:
              standard:
                sharding-column: user_id
                sharding-algorithm-name: database-inline
            table-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: table-inline
        
        # 绑定表
        binding-tables:
          - orders,order_items
        # 广播表
        broadcast-tables:
          - t_config
        
        # 分片算法
        sharding-algorithms:
          database-inline:
            type: INLINE
            props:
              algorithm-expression: db${user_id % 2}
          table-inline:
            type: INLINE
            props:
              algorithm-expression: orders_${order_id % 4}
        
        # 主键生成
        key-generators:
          snowflake:
            type: SNOWFLAKE
            props:
              worker-id: 1
      
      # 读写分离
      readwrite-splitting:
        data-sources:
          ds_group_0:
            write-data-source-name: db0
            read-data-source-names: db0_slave0, db0_slave1
            load-balancer-name: random
          ds_group_1:
            write-data-source-name: db1
            read-data-source-names: db1_slave0, db1_slave1
            load-balancer-name: random
        load-balancers:
          random:
            type: RANDOM
    
    # 公共配置
    props:
      sql:
        show: true
      executor:
        size: 20

注意事项

  1. 版本兼容性:不同版本的ShardingJdbc配置可能有所差异,请根据实际使用的版本参考官方文档
  2. 分片键选择:选择合适的分片键对性能影响很大,通常选择查询频率高、分布均匀的字段
  3. SQL兼容性:某些复杂SQL可能不被ShardingJdbc完全支持,需要注意测试
  4. 性能优化:对于大数据量场景,需要合理配置执行线程池、连接池等参数
  5. 监控:建议配置日志和监控,以便及时发现和解决问题

通过合理配置ShardingJdbc,可以有效解决单库单表的性能瓶颈,提高系统的扩展性和稳定性。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 ShardingJdbc配置说明 https://www.zuozi.net/35832.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务