本文上接前文,分析通过sharding的方式实现读写分离。
通过sharding数据库中间件实现读写分离,废话不说,直接上代码。
maven部分依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/sharding-jdbc-spring-boot-starter -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
Student实体类及mapper类
@Data
public class Student {
private int id;
private int num;
private String name;
}
public interface StudentMapper {
int insert(Student student);
List<Student> findAll();
List<Student> findBy(Student student);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.StudentMapper">
<insert id="insert" parameterType="com.model.Student">
INSERT INTO student(num,name) VALUES(#{num},#{name})
</insert>
<select id="findAll" resultType="com.model.Student">
select * from student
</select>
<select id="findBy" resultType="com.model.Student">
select * from student where num = #{num}
</select>
</mapper>
核心配置,application.yml
server:
port: 9002
spring:
application:
# 读写分离
name: sharding-masterslave
# 数据源名称,多数据源以逗号分隔
shardingsphere:
datasource:
names: ds0,ds1
# 数据源ds0
ds0:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/write
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
# 数据源ds1
ds1:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/read1
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
props:
sql.show: true
# 读写分离策略
sharding:
# 默认
default-data-source-name: ds0
master-slave-rules:
masterslave:
master-data-source-name: ds0
slave-data-source-names: ds1
# mybatis,放在resource目录 classpath:/mapper/*.xml
mybatis:
mapper-locations: classpath:mapper/*.xml
测试结果ok,可自行验证。
可见通过sharding数据库中间件实现读写分离非常快捷方便,后续需要深入理解中间件的底层原理及维护。