转载

使用Sharding-jdbc完成数据库读写分离

在如今分布式猖獗的时代,不仅系统架构要进行改变,数据库的性能问题也不能忽略, 进行读写分离也必不可少.(这里使用Spring Boot+Mybatis-Plus+MySQL实现)

1.配置数据库主从复制

我这里配置了一主一从,需要配置的小伙伴可以看我前几篇文章有说到如何配置 MySQL 主从复制。

使用Sharding-jdbc完成数据库读写分离

2.编写配置

2.1 导入Maven依赖

<!-- sharding-jdbc -->
<dependency>
    <groupId>io.shardingjdbc</groupId>
    <artifactId>sharding-jdbc-core</artifactId>
    <version>2.0.3</version>
</dependency>

<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
</dependency>

<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.15</version>
</dependency>
    
复制代码

2.2 配置数据源:application.yml

spring:
  datasource:
    url: jdbc:mysql://47.110.149.221:3306/gmall_pms
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
复制代码

2.3 编写sharding-jdbc.yml配置文件

dataSources:
  db_master: !!com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://主库ip:端口号/数据库
    username: 主库数据库用户名
    password: 对应的密码
  db_slave: !!com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://从机ip:端口号/数据库
    username: 从库数据库用户名
    password: 对应的密码
masterSlaveRule:
  name: db_ms # 这个名字可以随便取
  masterDataSourceName: db_master # 这个名称和上面定义都要一致
  slaveDataSourceNames: [db_slave] # 从机的名称,多个可以使用','隔开
复制代码

2.4 添加数据源

配置类 中将对应的数据源添加到容器中(这里写在一行了,不是很美观)

@Bean
public DataSource dataSource() throws IOException, SQLException {
    return MasterSlaveDataSourceFactory.createDataSource(ResourceUtils.getFile("classpath:sharding-jdbc.yml"));
}
复制代码

3.测试

到这里就配置好了一个读写分离,可以进行测试:

3.1先添加一条数据

使用Sharding-jdbc完成数据库读写分离

主库数据:

使用Sharding-jdbc完成数据库读写分离

从库数据:

使用Sharding-jdbc完成数据库读写分离

这里会发现没区别哈哈哈,因为主从复制了~,此时使用代码进行查询也分辨不出查的是主库还是从库。

3.2 修改从库数据

接下来就把从库或主库的数据修改一下,人为造成主从不一致方便我们测试 修改后的从库数据如下,主库未做修改:

使用Sharding-jdbc完成数据库读写分离
得出结果如下,发现查出的数据为从库修改后的,至此读写分离便可算完成了~如果数据为了保证数据添加后便查询最新的数据(数据一致性),可以使用如下方法:查出的数据便是从主库查询出来的:

这里就正式完成了一个读写分离的小案例,欢迎小伙伴在下方留言哦~

原文  https://juejin.im/post/5e1976b4f265da3df07c40d1
正文到此结束
Loading...