ShardingJDBC yml配置文件参数说明

本文介绍了如何将ShardingJDBC用于数据分表,并详细解析了在Spring Boot应用中ShardingJDBC的YAML配置参数,包括基于主键ID奇偶性的分片策略和自定义分片算法的配置。通过官方文档和实例,帮助读者理解和掌握ShardingJDBC的配置使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中用到shardingJDBC来实现数据分表功能。自己也开始慢慢接触到shadingJDBC,花了一点时间来解析一下shardingJDBC整合到springboot中配置文件中的参数作用。
先附上官网连接:https://shardingsphere.apache.org/document/4.1.0/en/manual/sharding-jdbc/configuration/config-yaml/
接下来开始对参数一个一个解析:

spring:
  shardingsphere:
    dataSources: #数据源配置,可以配置多个
      <data_source_name>: #<数据源池实现类> 具体的数据源
        driverClassName: #数据库驱动名
        url: #数据库连接
        username: #数据库名
        password: #数据库密码
    shardingRule:
      tables: #需要进行分表的逻辑表
        <logic_table_name>: #逻辑表名
          actualDataNodes: #描述数据源名称和实际表,分隔符为点,多个数据节点用逗号分隔,支持内联表达式。这意味着只对数据库进行分片。示例:ds${0..7}.tbl${1..0}
          tableStrategy: #表分片策略,如果没有,则使用默认的数据库分片战略。下面的分片策略只能选择一种。
            standard: #单分片列的标准分片场景
              shardingColum: #用于分片的列名称
              preciseAlgorithmClassName: #用于“=”和“IN”的精确算法类名。此类需要实现PreciseShardingAlgorithm,并且需要无参数构造函数
              rangeAlgorithmClassName: #用于“between”之间的范围算法类名。此类需要实现RangeShardingAlgorithm,并且需要无参数构造函数
            complex: #多个分片列的复杂分片场景
              shardingColumns: #分片列的名称。用逗号分隔的多列
              algorithmClassName: #复杂分片算法类名。此类需要实现ComplexKeysShardingAlgorithm,并且需要无参数构造函数
            inline: #单分片列的内联表达式分片场景
              shardingColum: #用于分片的列名称
              algorithmInlineExpression: #切分算法的内联表达式
            hint: #提示切分策略
              algorithmClassName: #提示切分算法类名。这个类需要实现HintShardingAlgorithm,并且需要一个无参数构造函数
            none: #不分片
          databaseStrategy: #数据库分片策略,与表分片策略一样
          keyGenerator:
            column:   #键生成器的列名
            type: #键生成器的类型 SNOWFLAKE或UUID
            props: #关于属性,请注意:当使用雪花时,`worker'。id'和'max.time.difference。需要设置“雪花”的毫秒数。要使用此算法的生成值作为分片值,建议配置“max.vibration.offset”`
      bindingTables:   #绑定表规则配置
    props:
      sql.show: #是否打印sql,默认为false
      executor.size: #工作线程数,默认CPU线程数
      check:
        table:
          metadata:
            enabled: #若要检查所有表的元数据一致性,默认值:false
      max:
        connections:
          size:
            per:
              query: #每个物理数据库的每个查询分配的最大连接数。默认值:1

官方也是对其中一个举了个例子。接下来分享两种分片策略的配置。
第一中:根据主键id奇偶进行分表

spring:
  main:
    allow-bean-definition-overriding: true

  shardingsphere:
    datasource:
      names: m1
      m1:
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://127.0.0.1:3306/contraband_management?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: 用户命
        password: 密码
    sharding:
      tables:
        contraband:
          actual-data-nodes: m1.contraband_t$->{1..2}
          #主键策略
          key-generateor:
            cloum: id
            type: SNOWFLAKE
          #分片算法
          table-strategy:
            inline:
              sharding-column: id
              algorithm-expression: contraband_t$->{Long.valueOf(id)%2 + 1}
    props:
      sql:
        show: true

第二种:自己定义分片算法

shardingsphere:
    datasource:
      names: ds0
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/contraband_management?useUnicode=true&useSSL=false&allowMultiQueries=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
        username: 用户名
        password: 密码
        druid:
          initial-size: 5
          min-idle: 5
          # 最大连接池数量
          max-active: 20
          # 获取连接等待超时的时间
          max-wait: 60000
          # 间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
          time-between-eviction-runs-millis: 60000
          # 一个连接在池中最小生存的时间,单位是毫秒
          min-evictable-idle-time-millis: 300000
          validation-query: SELECT 1
          # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
          test-while-idle: true
          # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
          test-on-borrow: false
          # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
          test-on-return: false
          # 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
          pool-prepared-statements: false
          # PSCache的大小
          max-pool-prepared-statement-per-connection-size: 20
          # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
          filters: #stat,wall
          filter:
            stat:
              slow-sql-millis: 5000
              merge-sql: true
          connection-properties:
          # 合并多个DruidDataSource的监控数据
          use-global-data-source-stat: true
    #由数据源名.表名组成。多个表以逗号分隔,支持inline表达式。缺省表示使用已知数据源与逻辑表名称生成数据节点。
    props:
      sql:
        show: false
    sharding-rule:
      tables:
        t_door:
          actual-data-nodes: ds0.t_door
          ## 指定分表规则
          table-strategy:
            standard:
              sharding-column: time
              precise-algorithm-class-name: com.jdb.contraband.config.shardingJDBC.PreciseSharingTableAlgorithmOfAlarmhis
              range-algorithm-class-name: com.jdb.contraband.config.shardingJDBC.RangeShardingAlgorithmOfAlarm
        t_alarm:
          actual-data-nodes: ds0.t_alarm
          ## 指定分表规则
          table-strategy:
            standard:
              sharding-column: time
              precise-algorithm-class-name: com.jdb.contraband.config.shardingJDBC.PreciseSharingTableAlgorithmOfAlarmhis
              range-algorithm-class-name: com.jdb.contraband.config.shardingJDBC.RangeShardingAlgorithmOfAlarm
      binding-tables:
        - t_door, t_alarm

precise-algorithm-class-name和range-algorithm-class-name两个类及为自定义分片策略。需要实现什么样的接口,参照第一个代码块的解析。结合解析看学习的更快更明白。希望对大家有帮助。

### 配置 Sharding-JDBC 5.3.2 实现读写分离 #### 准备工作 为了成功配置Sharding-JDBC 5.3.2实现读写分离,需先准备好相应的环境。这包括但不限于安装并运行多个MySQL实例作为主从服务器[^3]。 #### Maven依赖引入 在`pom.xml`文件中加入ShardingSphere-JDBC的相关依赖: ```xml <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>5.3.2</version> </dependency> ``` #### 应用程序属性设置 编辑项目的application.properties或application.yml来定义数据源和分片规则。对于读写分离而言,主要关注的是如何指定主库与从库的信息。下面是一个基于YAML格式的应用示例配置片段: ```yaml spring: shardingsphere: datasource: names: master,slave_0,slave_1 # 定义逻辑上的数据源名称 master: # 主数据库连接池参数 type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://10.0.0.3:3306/cool?serverTimezone=UTC&useSSL=false username: root password: pwd slave_0: # 第一副本数据库连接池参数 type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://10.0.0.13:3306/cool?serverTimezone=UTC&useSSL=false username: root password: pwd slave_1: # 第二副本数据库连接池参数 type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://10.0.0.17:3306/cool?serverTimezone=UTC&useSSL=false username: root password: pwd masterslave: load-balance-algorithm-type: round_robin # 设置负载均衡算法类型为轮询方式 name: ds_ms # 自定义的数据源名字 master-data-source-name: master # 明确指出哪个是master节点 slave-data-source-names: slave_0,slave_1 # 列举所有的slaves节点名 ``` 上述配置指定了三个不同的数据源:一个是用于写的主节点(master),另外两个是从节点(slave_0 和 slave_1)[^2]。通过这种方式可以有效地将查询操作分配给只读的副本来减轻主服务器的压力。 #### 启动类注解声明 确保应用程序启动类上有@EnableTransactionManagement以及@MapperScan等必要的Spring事务管理和MyBatis映射器扫描注解,以便能够正常处理分布式事务和支持持久化层开发。 ```java @SpringBootApplication @EnableTransactionManagement @MapperScan(basePackages = "com.example.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } } ``` 完成以上步骤之后,重启应用即可生效新的读写分离策略。此时,当执行更新、插入等修改型SQL语句时会自动路由到主库;而针对SELECT这样的查询请求则会被转发至其中一个可用的从库上去执行[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值