关于MySQL主从搭建,可以参考我的文章
学习docker第五天之MySQL主从复制搭建_Husky_jzq的博客-CSDN博客
首先导入相关的pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.22</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
导入依赖后配置shardingsphere-jdbc的yml文件
spring:
shardingsphere:
# 数据源配置
datasource:
# 数据源名称,多数据源以逗号分隔
names: master,slave
master:
# 数据库连接池类名称
type: com.zaxxer.hikari.HikariDataSource
# 数据库驱动类名
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://ip:端口/数据库?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
slave:
# 数据库连接池类名称
type: com.zaxxer.hikari.HikariDataSource
# 数据库驱动类名
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://ip:端口/数据库?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
# 规则配置
rules:
readwrite-splitting:
load-balancers:
ms:
type: ROUND_ROBIN
props:
workId: 1
data-sources:
ms:
type: Static
load-balancer-name: round-robin
props:
write-data-source-name: master
read-data-source-names: slave
# 属性配置
props:
# 展示修改以后的sql语句
sql-show: true
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
然后测试读写情况,读是在slave,写是在master
至此,读写分离集成成功!
笔者此次读写分离是一主一从,既然读写分离就涉及事务问题。在配置成功后发现使用事务失败@Transactional。基于之前项目配置过一次双数据源和本次读写分离的形式,笔者认为,既然是一主一从,按理说只需要指定主库进行事务即可(因为从库会同步主库)。所以在进行相关查阅后,进行事务管理器的配置,指定@Transactional的事务为主库事务即可。相关配置如下:
进过测试,事务成功
主库数据
从库数据
版权声明:本文为GINNOSQL原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。