参考:这是shard-jdbc2.x的
官网:https://shardingsphere.apache.org/document/current/cn/overview/
框架 | 版本 |
---|---|
shard-jdbc | 4.0.0-RC2 |
spring boot | 2.1.7 |
mybatis-plus | 3.2.0 |
druid | 1.1.18 |
mysql | 8.x |
当当网开源的组件,现在收录到apache
官网提供多种部署方式,这里我是用spring boot风格的依赖
<!-- sharding-jdbc驱动 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>${sharding-sphere.version}</version>
</dependency>
<!-- sharding-jdbc驱动 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>${sharding-sphere.version}</version>
</dependency>
druid依赖不要使用spring boot starter自动配置的依赖,因为shard-jdbc的配置不需要配spring.datasource,而使用druid-spring-boot-starter,由于auto configuration一直读不到spring.datasource,导致启动一直报错。查了很久才发现是使用这个依赖导致
不要用这种spring boot风格依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
用这种maven风格的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
spring:
# shard-jdbc 读写分离配置(仅支持一主多从的结构)
shardingsphere:
# 主从配置
masterslave:
name: ms # 主从数据源名称
load-balance-algorithm-type: round_robin # 负载均衡算法 ROUND_ROBIN,RANDOM
master-data-source-name: master # 主库名称
slave-data-source-names: slave0,slave1 # 从库名称列表
# 其他属性
props:
# 是否在启动时检查分表元数据一致性,默认值: false
check:
table:
metadata:
enabled: false
# 工作线程数量,默认值: CPU核数
# executor:
# size: 8
# 是否开启SQL显示,默认值: false
sql:
show: true
# 数据源配置
datasource:
# 数据源名称,多数据源以逗号分隔
names: master,slave0,slave1
# 主库的datasource配置
master:
# 指定使用druid连接池
type: com.alibaba.druid.pool.DruidDataSource
# 默认连接配置
url: jdbc:mysql://ip1:3306/iif_user?useUnicode=true&useSSL=false&characterEncoding=utf8
username: root
password: 123456
# driver-class-name: com.mysql.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver # mysql 8 包路径变了
# druid专属的属性配置
platform: mysql
# type: com.alibaba.druid.pool.DruidDataSource
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 30000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
#useGlobalDataSourceStat: true
web-stat-filter:
enabled: false
url-pattern: /*
exclusions: '*.gif,*.png,*.jpg,*.html,*.js,*.css,*.ico,/druid/*'
# Druid StatViewServlet配置 可视化web界面
stat-view-servlet:
enabled: false
url-pattern: /druid/*
reset-enable: true
login-username: admin
login-password: admin
# 配置日志输出
filter:
slf4j:
enabled: false
statement-create-after-log-enabled: false
statement-close-after-log-enabled: false
result-set-open-after-log-enabled: false
result-set-close-after-log-enabled: false
# 从库0的datasource配置
slave0:
# 指定使用druid连接池
type: com.alibaba.druid.pool.DruidDataSource
# 默认连接配置
url: jdbc:mysql://ip2:3307/iif_user?useUnicode=true&useSSL=false&characterEncoding=utf8
username: root
password: 123456
# driver-class-name: com.mysql.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver # mysql 8 包路径变了
# druid专属的属性配置
platform: mysql
# type: com.alibaba.druid.pool.DruidDataSource
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 30000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
#useGlobalDataSourceStat: true
web-stat-filter:
enabled: false
url-pattern: /*
exclusions: '*.gif,*.png,*.jpg,*.html,*.js,*.css,*.ico,/druid/*'
# Druid StatViewServlet配置 可视化web界面
stat-view-servlet:
enabled: false
url-pattern: /druid/*
reset-enable: true
login-username: admin
login-password: admin
# 配置日志输出
filter:
slf4j:
enabled: false
statement-create-after-log-enabled: false
statement-close-after-log-enabled: false
result-set-open-after-log-enabled: false
result-set-close-after-log-enabled: false
# 从库1
slave1:
# 指定使用druid连接池
type: com.alibaba.druid.pool.DruidDataSource
# 默认连接配置
url: jdbc:mysql://ip3:3308/iif_user?useUnicode=true&useSSL=false&characterEncoding=utf8
username: root
password: mysql@dongri
# driver-class-name: com.mysql.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver # mysql 8 包路径变了
# druid专属的属性配置
platform: mysql
# type: com.alibaba.druid.pool.DruidDataSource
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 30000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
#useGlobalDataSourceStat: true
web-stat-filter:
enabled: false
url-pattern: /*
exclusions: '*.gif,*.png,*.jpg,*.html,*.js,*.css,*.ico,/druid/*'
# Druid StatViewServlet配置 可视化web界面
stat-view-servlet:
enabled: false
url-pattern: /druid/*
reset-enable: true
login-username: admin
login-password: admin
# 配置日志输出
filter:
slf4j:
enabled: false
statement-create-after-log-enabled: false
statement-close-after-log-enabled: false
result-set-open-after-log-enabled: false
result-set-close-after-log-enabled: false
# 读写分离规则
sharding:
master-slave-rules:
ms: # 主从数据源名称
master-data-source-name: master #主库数据源名称
slave-data-source-names[0]: slave0 #从库数据源名称列表
slave-data-source-names[1]: slave1 #从库数据源名称列表
# load-balance-algorithm-class-name: #从库负载均衡算法类名称。该类需实现MasterSlaveLoadBalanceAlgorithm接口且提供无参数构造器
load-balance-algorithm-type: round_robin #从库负载均衡算法类型,可选值:轮询 ROUND_ROBIN,随机 RANDOM。若`load-balance-algorithm-class-name`存在则忽略该配置
因为在配置项设置打印sql
可以看到写操作都在主库:master
读操作在从库(指定轮询策略):slave0,slave1
目前看到功能是正常的,后续使用过程中,再发现下是否稳定?是否有坑?