# springboot整合sharding-jdbc **Repository Path**: mi1688/sharding-jdbc ## Basic Information - **Project Name**: springboot整合sharding-jdbc - **Description**: 基于springboot整合sharding-jdbc 项目,实现分库分表案例 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2022-01-21 - **Last Updated**: 2022-01-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # sharding-jdbc-demo ## sharding-jdbc 简单介绍 **官方介绍** `sharding-jdbc`将自身定义为轻量级`Java`框架,该框架在`Java` `JDBC`层提供额外的服务。客户端直接连接到数据库时,它以`jar`形式提供服务,并且不需要额外的部署和依赖性。它可以被认为是增强的`JDBC`驱动程序,它与`JDBC`和各种`ORM`框架完全兼容 [官方 Gitee 地址]() ## 代码实例 `4.0.0-RC1`版本,官网地址[shardingsphere.apache.org]()。 ### 前期准备 **开发环境** > MySQL 5.7 > Mven 3.6 > Java 1.8 > SpringBoot 2.0.6.RELEASE **pom.xml** ```xml org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test com.baomidou mybatis-plus-boot-starter 3.2.0 mysql mysql-connector-java com.alibaba druid-spring-boot-starter 1.1.17 org.projectlombok lombok 1.18.8 org.apache.shardingsphere sharding-jdbc-spring-boot-starter 4.0.0-RC1 ``` # ### 配置yml 配置多个数据源并将表分配到不同的数据源,并配置分表策略和主键策略(稍有改动,以代码为准) 分库分表配置: #sharding-jdbc 实现分库分表的配置, spring: main: allow-bean-definition-overriding: true # 当遇到同一个实体类同时映射多个相同的表名字的时候,是否允许覆盖注册 shardingsphere: # 配置多个数据源 datasource: names: ds0,ds1,ds2 ds0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/sharding_jdbc_0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 initial-size: 4 # 初始化时建立物理连接的个数 min-idle: 1 # 最小连接池数量 max-active: 40 # 最大连接数量 query-timeout: 60000 #查询超时 filters: stat,config # stat表示sql合并 testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效 ds1: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/sharding_jdbc_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 initial-size: 4 # 初始化时建立物理连接的个数 min-idle: 1 # 最小连接池数量 max-active: 40 # 最大连接数量 query-timeout: 60000 #查询超时 filters: stat,config # stat表示sql合并 testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效 ds2: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/sharding_jdbc_2?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 initial-size: 4 # 初始化时建立物理连接的个数 min-idle: 1 # 最小连接池数量 max-active: 40 # 最大连接数量 query-timeout: 60000 #查询超时 filters: stat,config # stat表示sql合并 testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效 # (不同的表在不同的库中) sharding: tables: menu: #(该表只会存在于一个数据库中的单表) # 配置单表数据源(该表只会存在于一个数据库中) actual-data-nodes: ds0.menu #既不分库也不分表 只存在当前配置的库中 # 配置主键策略 key-generator-column-name: id key-generator: type: SNOWFLAKE column: id user: # 只分库不分表 # 配置主键策略 key-generator-column-name: id key-generator: type: SNOWFLAKE column: id actual-data-nodes: ds$->{['0','1','2']}.user #数据节点 注意 只分库不分表 database-strategy: #分库策略 inline: #行表达式 sharding-column: dept_id #列名称,多个列以逗号分隔 algorithm-expression: ds$->{dept_id % 3} #按模运算分配 department: # 配置分库数据源(分库分表处理) actual-data-nodes: ds$->{['0','1','2']}.department${['0','1','2']} #数据节点 即分库也分表 # 配置主键策略 key-generator-column-name: id key-generator: type: SNOWFLAKE column: id #分库策略 database-strategy: inline: sharding-column: id #分库字段 algorithm-expression: ds$->{id % 3} # 多个库进行取模运算 ## 分表策略 table-strategy: # inline 表达式配置分表 inline: sharding-column: dept_id #分表字段 algorithm-expression: department$->{dept_id % 3} # 多张表进行取模运算 binding-tables: user,department #如果有关联表没配置绑定有可能会出现笛卡尔积 #广播规则表配置: 解释-- 每一条数据都会向每个数据源里面的改表进行同步的 crud操作,每个库里面的该表的数据是同步的 broadcast-tables: # 此处添加的表明在 每个库里面都应该存在表,并且数据是同步的 ,一般多表用于关联查询时的解决方案 # 默认的库配置以及主键生成策略(雪花算法生成主键) default-data-source-name: ds0 default-database-strategy: none: default-key-generator: type: SNOWFLAKE column: id props: sql.show: true # 显示sql 读写分离配置: # 切记: 首先要开启 数据库数据同步功能 mysql: 开启mysql-binlog日志 #sharding-jdbcReadWrite 实现读写分离的配置 master/slave spring: main: allow-bean-definition-overriding: true # 当遇到同一个实体类同时映射多个相同的表名字的时候,是否允许覆盖注册 shardingsphere: # 配置多个数据源 datasource: names: ds_master,ds_slave0,ds_slave1 ds_master: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/jdbc_master?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 initial-size: 4 # 初始化时建立物理连接的个数 min-idle: 1 # 最小连接池数量 max-active: 40 # 最大连接数量 query-timeout: 60000 #查询超时 filters: stat,config # stat表示sql合并 testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效 ds_slave0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/jdbc_slave0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 initial-size: 4 # 初始化时建立物理连接的个数 min-idle: 1 # 最小连接池数量 max-active: 40 # 最大连接数量 query-timeout: 60000 #查询超时 filters: stat,config # stat表示sql合并 testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效 ds_slave1: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/jdbc_slave1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 initial-size: 4 # 初始化时建立物理连接的个数 min-idle: 1 # 最小连接池数量 max-active: 40 # 最大连接数量 query-timeout: 60000 #查询超时 filters: stat,config # stat表示sql合并 testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效 # 配置读写分离规则 masterslave: name: ds_ms #规则名称 master-data-source-name: ds_master #主库 多个逗号隔开 slave-data-source-names: ds_slave0,ds_slave1 # 从库 多个逗号隔开 loadBalanceAlgorithmType: ROUND_ROBIN #从库负载均衡算法类型,可选值:ROUND_ROBIN,RANDOM。(循环/随机) 若`loadBalanceAlgorithmClassName`存在则忽略该配置 props: sql.show: true # 显示sql