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
核心
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
########################################################################
########################### 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就不发了
添加/修改/删除—> 主数据库,查询—> 从数据库
查询多个从数据库数据算法: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的分表数据