在如今分布式猖獗的时代,不仅系统架构要进行改变,数据库的性能问题也不能忽略, 进行读写分离也必不可少.(这里使用Spring Boot+Mybatis-Plus+MySQL实现)
我这里配置了一主一从,需要配置的小伙伴可以看我前几篇文章有说到如何配置 MySQL
主从复制。
<!-- 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> 复制代码
spring: datasource: url: jdbc:mysql://47.110.149.221:3306/gmall_pms username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver 复制代码
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] # 从机的名称,多个可以使用','隔开 复制代码
在 配置类 中将对应的数据源添加到容器中(这里写在一行了,不是很美观)
@Bean public DataSource dataSource() throws IOException, SQLException { return MasterSlaveDataSourceFactory.createDataSource(ResourceUtils.getFile("classpath:sharding-jdbc.yml")); } 复制代码
到这里就配置好了一个读写分离,可以进行测试:
主库数据:
从库数据:
这里会发现没区别哈哈哈,因为主从复制了~,此时使用代码进行查询也分辨不出查的是主库还是从库。
接下来就把从库或主库的数据修改一下,人为造成主从不一致方便我们测试 修改后的从库数据如下,主库未做修改:
得出结果如下,发现查出的数据为从库修改后的,至此读写分离便可算完成了~如果数据为了保证数据添加后便查询最新的数据(数据一致性),可以使用如下方法:查出的数据便是从主库查询出来的:这里就正式完成了一个读写分离的小案例,欢迎小伙伴在下方留言哦~