Springboot 集成 Sharding-JDBC+Mybatis实现读写分离

发布时间:2026/10/31 10:56:28
Springboot 集成 Sharding-JDBC+Mybatis实现读写分离

一、前言

Sharding-jdbc是开源的数据库操作中间件;定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

官方文档地址:https://shardingsphere.apache.org/document/current/cn/overview/

二、代码实战

2.1 创建springboot项目

本节用到的具体基础代码创建过程可以参考《Spring-Boot整合MyBatis》

2.2 引入依赖

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version></dependency>

2.3 修改application.yml

spring:main:allow-bean-definition-overriding:trueshardingsphere:props:sql:show:true#显示sqlsharding:default-data-source-name:ds1#配置默认数据源ds1 默认数据源,主要用于写.如果和masterslave节点都不配置,则三个数据源都会当作salve,在新增\修改\删除会报错masterslave:name:ms#配置主从名称master-data-source-name:ds1#置主库master,负责数据的写入slave-data-source-names:ds2,ds3#配置从库slave节点load-balance-algorithm-type:round_robin#配置slave节点的负载均衡均衡策略,采用轮询机制datasource:names:ds1,ds2,ds3#配置数据源ds1:#master-ds1数据库连接信息type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true&useSSL=falseusername:springpassword:spring#123maxPoolSize:100minPoolSize:5ds2:#slave-ds2数据库连接信息type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true&useSSL=falseusername:springpassword:spring#123maxPoolSize:100minPoolSize:5ds3:#slave-ds3数据库连接信息type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true&useSSL=falseusername:springpassword:spring#123maxPoolSize:100minPoolSize:5

Props的其他相关配置

  1. acceptor.size: # accept连接的线程数量,默认为cpu核数2倍
  2. executor.size: #工作线程数量最大,默认值: 无限制
  3. max.connections.size.per.query: # 每个查询可以打开的最大连接数量,默认为1
  4. check.table.metadata.enabled: #是否在启动时检查分表元数据一致性,默认值: false
  5. proxy.frontend.flush.threshold: # proxy的服务时候,对于单个大查询,每多少个网络包返回一次
  6. proxy.transaction.type: # 默认LOCAL,proxy的事务模型 允许LOCAL,XA,BASE三个值,LOCAL无分布式事务,XA则是采用atomikos实现的分布式事务 BASE目前尚未实现
  7. proxy.opentracing.enabled: # 是否启用opentracing
  8. proxy.backend.use.nio: # 是否采用netty的NIO机制连接后端数据库,默认False ,使用epoll机制
  9. proxy.backend.max.connections: # 使用NIO而非epoll的话,proxy后台连接每个netty客户端允许的最大连接数量(注意不是数据库连接限制) 默认为8
  10. proxy.backend.connection.timeout.seconds: #使用nio而非epoll的话,proxy后台连接的超时时间,默认60s

2.3 验证

创建StudentController.java

@RestController@RequestMapping("/api/student")publicclassStudentController{@AutowiredprivateStudentServicestudentService;@GetMapping("/save")publicStringaddUser(){Students=newStudent();s.setName("wno"+newRandom().nextInt());s.setSex("M");s.setSno(10000+newRandom().nextInt());studentService.add(s);return"success";}@GetMapping("/findStudent")publicStudentfindUsers(intsno){returnstudentService.queryStudentBySno(sno);}}

启动日志中三个数据源初始化成功:

调用 http://localhost:8080/api/student/save一直进入到ds1主节点

调用 http://localhost:8080/api/student/findStudent?sno=1一直进入到ds2、ds3节点,并且轮询进入