ShardingJdbc配置说明

ShardingJdbc配置说明

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

1. 基础依赖配置

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

xml 复制代码
<!-- Sharding-JDBC Spring Boot Starter -->
<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中配置数据源:

yaml 复制代码
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 表分片配置

yaml 复制代码
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 绑定表配置

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

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

3.3 广播表配置

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

yaml 复制代码
spring:
  shardingsphere:
    rules:
      sharding:
        broadcast-tables:
          - t_config  # 广播表名
          - t_dict    # 多个广播表

4. 分片算法配置

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

4.1 内联分片算法

yaml 复制代码
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 范围分片算法

yaml 复制代码
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 哈希分片算法

yaml 复制代码
spring:
  shardingsphere:
    rules:
      sharding:
        sharding-algorithms:
          hash-sharding:
            type: HASH_MOD
            props:
              sharding-count: 4

4.4 时间分片算法

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

5. 主键生成策略配置

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

6. 读写分离配置

yaml 复制代码
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. 公共配置项

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

8. 分布式事务配置

ShardingJdbc支持XA事务和SAGA事务:

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

9. 自定义分片算法实现

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

java 复制代码
public class CustomShardingAlgorithm implements StandardShardingAlgorithm<Long> {
    
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> 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<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Long> shardingValue) {
        // 实现范围分片逻辑
        Collection<String> result = new LinkedHashSet<>();
        Range<Long> 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. 配置示例(完整)

yaml 复制代码
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,可以有效解决单库单表的性能瓶颈,提高系统的扩展性和稳定性。

相关推荐
javachen__6 小时前
Spring Boot将错误日志发送到企微微信或钉钉群
spring boot·后端·钉钉
JaguarJack7 小时前
PHP 基金会宣布:Streams 现代化 将引入事件循环与异步新能力
后端·php
lzjava20247 小时前
Spring AI实现一个智能客服
java·人工智能·spring
Mos_x7 小时前
HeidiSQL导入与导出数据
java·后端
oak隔壁找我7 小时前
Elasticsearch QueryBuilders 高级使用案例
java·后端
青云交7 小时前
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用
java·大数据·智能家居·数据采集·能源消耗模式分析·节能策略制定·节能效果评估
Zhang青山7 小时前
【玩转全栈】----Django基本配置和介绍
java·后端
BUG?不,是彩蛋!8 小时前
Java Web 项目打包部署全解析:从 IDEA 配置到 Tomcat 运行
java·intellij-idea
勇敢牛牛_8 小时前
Rust真的适合写业务后端吗?
开发语言·后端·rust