springboot -- 整合 sharding-jdbc 读写分离+分库分表配置(进阶)

sharding-jdbc 说明 :

1、分库分表不能中途更改,取模算法的id会出错
2、不支持特殊sql,包括去重,子sql,聚合等
3、查询会给所有表发查询sql, 带上分库, 分表的字段的查询只发一条,
4、查询数据要注意使用,尽量带上分库或分表字段来查询,避免多表查询sql过多

取模算法

假设2个表,test_0,test_1 , 分表字段为 uid

uid=          计算          添加数据至
  1          1%2 = 1        test_1   (test_1 中包含 1 ,数据添加至 test_1 )
  2          2%2 = 0        test_0 
  3          3%2 = 1        test_1 
  4          4%2 = 0        test_0
  5          5%2 = 1        test_1 
  6          6%2 = 0        test_0

pom.xml (本篇文章所有依赖)

核心

        
        
            io.shardingsphere
            sharding-jdbc-spring-boot-starter
            3.0.0.M3
        

其他必要依赖

       
        
            com.alibaba
            druid-spring-boot-starter
            1.1.10
        
        
        
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        
        
        
        
            mysql
            mysql-connector-java
            runtime
        
        
         
        
            org.springframework.boot
            spring-boot-starter
        
        
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
        
        
            org.springframework.boot
            spring-boot-devtools
            true
        

配置文件(sharding.jdbc 可以使用各种dao层框架,不是必须jpa)

########################################################################
########################### JPA 配置 ###################################
########################################################################
server.port=8080
#指定数据库类型 + #控制台打印sql +  #建表策略,这里用update,即根据实体更新表结构(none)
spring.jpa.database=mysql
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=none
#表中字段命名策略,这里要引入hibernate的核心包,不然这个命名策略会报错
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.main.allow-bean-definition-overriding=true

###  读写分离
#spring.profiles.active =  dev
###  单库多表
#spring.profiles.active =  pro
###  多库单表
#spring.profiles.active =  pro1
###  多库多表
spring.profiles.active =  pro2

controller/dao/entity,service就不发了
springboot -- 整合 sharding-jdbc 读写分离+分库分表配置(进阶)_第1张图片

配置文件走起

读写分离

添加/修改/删除—> 主数据库,查询—> 从数据库
查询多个从数据库数据算法:round_robin(轮询)和random(随机)


#######################################################################################
######################### sharding_jdbc读写分离配置 ###################################
#######################################################################################
### 说明:
###  1、读取数据使用从数据库(slave),多个从数据库算法:round_robin(轮询)和random(随机)
###  2、写入数据使用主数据库(master,添加,修改,删除)
###  3、读写分离配置 master为主,slave为从,多个从数据库逗号分隔
###  4、sharding.jdbc 没有做主从复制,需要自己处理多个数据库之间的同步数据操作
###  5、ds0.type=com.alibaba.druid.pool.DruidDataSource 代表的当前使用数据源(我这里是 Druid)

# 数据源集
sharding.jdbc.datasource.names=ds0,ds1,ds2

# 主数据源
sharding.jdbc.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds0.url=jdbc:mysql://ip:3306/test_0?characterEncoding=utf-8
sharding.jdbc.datasource.ds0.username=root
sharding.jdbc.datasource.ds0.password=root123456

# 从数据源一
sharding.jdbc.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds1.url=jdbc:mysql://ip:3306/test_1?characterEncoding=utf-8
sharding.jdbc.datasource.ds1.username=root
sharding.jdbc.datasource.ds1.password=root123456

# 从数据源二
sharding.jdbc.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds2.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds2.url=jdbc:mysql://ip:3306/test_2?characterEncoding=utf-8
sharding.jdbc.datasource.ds2.username=root
sharding.jdbc.datasource.ds2.password=root123456

### 读写分离配置
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
sharding.jdbc.config.masterslave.name=dataSource
sharding.jdbc.config.masterslave.master-data-source-name=ds0
sharding.jdbc.config.masterslave.slave-data-source-names=ds1,ds2

测试方法: 添加数据查看在哪个数据库里面,查询看查的那个数据库的数据|| ShardingDataSource 类

单库多表

一个库下的表拆分成多个



#######################################################################################
######################### sharding_jdbc 分库分表配置 ##################################
#########################           单库多表         ##################################
#######################################################################################

# 数据源 注:这里不能使用下划线_(未知错误,不能使用特殊符号)
sharding.jdbc.datasource.names=ds0

# 数据源
sharding.jdbc.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds0.url=jdbc:mysql://ip:3306/test_0?characterEncoding=utf-8
sharding.jdbc.datasource.ds0.username=root
sharding.jdbc.datasource.ds0.password=root123456

### 默认数据源
sharding.jdbc.config.sharding.default-data-source-name=ds0

### 分表策略
sharding.jdbc.config.sharding.tables.Test.actual-data-nodes=ds0.Test_$->{0..1}
sharding.jdbc.config.sharding.tables.Test.table-strategy.inline.algorithm-expression=Test_$->{uid % 2}
sharding.jdbc.config.sharding.tables.Test.table-strategy.inline.sharding-column=uid

#打印sql
sharding.jdbc.config.sharding.props.sql.show=true


######################################  分表策略 ###################################
###  actual-data-nodes                           读取数据分表策略
###  table-strategy.inline                       添加数据分表策略
###  table-strategy.inline.sharding-column       添加数据分表字段(根据字段插入数据到那个表,如:uid)
###  --- ds0.Test                                代表只查询(未分库分表)
###  --- ds0.Test_$->{0..1}                      代表查询ds0库下后缀为0的库到后缀为1的所有表数据
###  --- Test_$->{uid % 2}                       uid % 2 的余等于库后缀,判断数据添加至那个表(取模算法)

多库单表

多个库单个的表



#######################################################################################
######################### sharding_jdbc 分库分表配置 ##################################
#########################           多库单表         ##################################
#######################################################################################

# 数据源 注:这里不能使用下划线_
sharding.jdbc.datasource.names=ds0,ds1

# 数据源一
sharding.jdbc.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds0.url=jdbc:mysql://ip:3306/test_0?characterEncoding=utf-8
sharding.jdbc.datasource.ds0.username=root
sharding.jdbc.datasource.ds0.password=root123456

# 数据源二
sharding.jdbc.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds1.url=jdbc:mysql://ip:3306/test_1?characterEncoding=utf-8
sharding.jdbc.datasource.ds1.username=root
sharding.jdbc.datasource.ds1.password=root123456

### 默认数据源
sharding.jdbc.config.sharding.default-data-source-name=ds0

### 分库策略
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=uid
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{uid  % 2}

### 查询数据
sharding.jdbc.config.sharding.tables.Test.actual-data-nodes=ds$->{0..1}.Test

#打印sql
sharding.jdbc.config.sharding.props.sql.show=true

######################################  分库策略 ###################################
###  sharding-column=uid                       根据那个字段分库
###  algorithm-expression=ds$->{uid  % 2}      uid % 2 的余等于库后缀,判断数据添加至那个库(取模算法)
###  actual-data-nodes=ds$->{0..1}.Test        代表查询后缀为0的库到后缀为1的库的所有Test表数据

多库多表



#######################################################################################
######################### sharding_jdbc 分库分表配置 ##################################
#########################           多库多表         ##################################
#######################################################################################

# 数据源 注:这里不能使用下划线_
sharding.jdbc.datasource.names=ds0,ds1

# 数据源一
sharding.jdbc.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds0.url=jdbc:mysql://ip:3306/test_0?characterEncoding=utf-8
sharding.jdbc.datasource.ds0.username=root
sharding.jdbc.datasource.ds0.password=root123456

# 数据源二
sharding.jdbc.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds1.url=jdbc:mysql://ip:3306/test_1?characterEncoding=utf-8
sharding.jdbc.datasource.ds1.username=root
sharding.jdbc.datasource.ds1.password=root123456

# 默认数据源
sharding.jdbc.config.sharding.default-data-source-name=ds0

## 分库策略 -- > 分表分库使用相同字段,则分库使用十位,分表使用个位(这里使用uid十位来分库,使用十位分库字段不能小于10)
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=uid
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{Long.parseLong(uid.toString().substring(uid.toString().length()-2,uid.toString().length()-1))  % 2}
### sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{uid % 2}

## 分表策略||查询数据
sharding.jdbc.config.sharding.tables.Test.actual-data-nodes=ds$->{0..1}.Test_$->{0..1}
sharding.jdbc.config.sharding.tables.Test.table-strategy.inline.algorithm-expression=Test_$->{uid % 2}
sharding.jdbc.config.sharding.tables.Test.table-strategy.inline.sharding-column=uid

#打印sql
sharding.jdbc.config.sharding.props.sql.show=true

### 分库字段uid获取十位方法     -->  Long.parseLong(uid.toString().substring(uid.toString().length()-2,uid.toString().length()-1))
### ds$->{0..1}.Test_$->{0..1}  -->  查询0到1个使用分库下的所有0到1的分表数据

你可能感兴趣的:(springboot)