一、前言

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的其他相关配置

  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

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节点,并且轮询进入