一、前言 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 引入依赖 1 2 3 4 5 <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version> </dependency>
2.3 修改application.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 spring: main: allow-bean-definition-overriding: true shardingsphere: props: sql: show: true #显示sql sharding: 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.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true&useSSL=false username: spring password: spring#123 maxPoolSize: 100 minPoolSize: 5 ds2: #slave-ds2数据库连接信息 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true&useSSL=false username: spring password: spring#123 maxPoolSize: 100 minPoolSize: 5 ds3: #slave-ds3数据库连接信息 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true&useSSL=false username: spring password: spring#123 maxPoolSize: 100 minPoolSize: 5
Props的其他相关配置
acceptor.size: # accept连接的线程数量,默认为cpu核数2倍 executor.size: #工作线程数量最大,默认值: 无限制 max.connections.size.per.query: # 每个查询可以打开的最大连接数量,默认为1 check.table.metadata.enabled: #是否在启动时检查分表元数据一致性,默认值: false proxy.frontend.flush.threshold: # proxy的服务时候,对于单个大查询,每多少个网络包返回一次 proxy.transaction.type: # 默认LOCAL,proxy的事务模型 允许LOCAL,XA,BASE三个值,LOCAL无分布式事务,XA则是采用atomikos实现的分布式事务 BASE目前尚未实现 proxy.opentracing.enabled: # 是否启用opentracing proxy.backend.use.nio: # 是否采用netty的NIO机制连接后端数据库,默认False ,使用epoll机制 proxy.backend.max.connections: # 使用NIO而非epoll的话,proxy后台连接每个netty客户端允许的最大连接数量(注意不是数据库连接限制) 默认为8 proxy.backend.connection.timeout.seconds: #使用nio而非epoll的话,proxy后台连接的超时时间,默认60s 2.3 验证 创建 StudentController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 @RestController @RequestMapping("/api/student") public class StudentController { @Autowired private StudentService studentService; @GetMapping("/save") public String addUser() { Student s = new Student(); s.setName("wno" + new Random().nextInt()); s.setSex("M"); s.setSno(10000 + new Random().nextInt()); studentService.add(s); return "success"; } @GetMapping("/findStudent") public Student findUsers(int sno) { return studentService.queryStudentBySno(sno); } }
启动日志中三个数据源初始化成功:
调用 http://localhost:8080/api/student/save 一直进入到ds1主节点
调用 http://localhost:8080/api/student/findStudent?sno=1 一直进入到ds2、ds3节点,并且轮询进入