Sharding JDBC 读写分离

环境需要

JDK 1.8
实现主从复制的两个数据库(主库、从库至少各一)

依赖

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<dependencies>
<!--springboot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>org.springframework.boot:spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- springboot 测试框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>

<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<!--mybatis-plus对springboot支持,不用再单独导入mp的依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>

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

<!--阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.14</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

配置文件

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
spring:
main:
allow-bean-definition-overriding: true
shardingsphere:
datasource:
names: master,slave
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://39.97.225.133:33306/master_test?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
slave:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://39.97.225.133:33307/master_test?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
masterslave:
# \u8BFB\u5199\u5206\u79BB\u914D\u7F6E
load-balance-algorithm-type: round_robin 轮询
# \u6700\u7EC8\u7684\u6570\u636E\u6E90\u540D\u79F0
name: dataSource
# \u4E3B\u5E93\u6570\u636E\u6E90\u540D\u79F0 主库
master-data-source-name: master
# \u4ECE\u5E93\u6570\u636E\u6E90\u540D\u79F0\u5217\u8868\uFF0C\u591A\u4E2A\u9017\u53F7\u5206\u9694 从库
slave-data-source-names: slave
props:
# \u5F00\u542FSQL\u663E\u793A\uFF0C\u9ED8\u8BA4false
sql:
show: true

测试,观察控制台日志输出,可以发现读操作和写操作时使用的是不同的数据库,即读写分离成功实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class DemoApplicationTests {

@Autowired
private UserMapper userMapper;

@Test
public void testSearch() {
List<User> users= userMapper.selectList(null);
System.out.println(users);
}

@Test
public void testSave() {
User user= new User();
user.setId(1L);
userMapper.insert(user);
}

}
如果你觉得有帮助,慷慨如你,可以扫描下面的二维码赞赏一下