spring boot使用shard-jdbc读写分离功能

mac2026-04-14  0

参考:这是shard-jdbc2.x的 官网:https://shardingsphere.apache.org/document/current/cn/overview/

环境
框架版本shard-jdbc4.0.0-RC2spring boot2.1.7mybatis-plus3.2.0druid1.1.18mysql8.x
shard-jdbc依赖

当当网开源的组件,现在收录到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依赖

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

目前看到功能是正常的,后续使用过程中,再发现下是否稳定?是否有坑?

最新回复(0)