在大部分应用中,基本上都是读多写少,也就是从数据库加载数据的场景要比往数据库中添加或者修改数据的场景多,如果我们把所有对数据库的读/写请求都访问到同一个数据库中时,对数据库必然会造成较大的压力,同时也会影响到业务系统的性能,这部分性能影响主要体现在:
请求量过大对数据库服务器的压力较大,数据库服务器无法支撑;
频繁的共享锁或排他锁的竞争,对性能产生影响;
所以为了优化读多写少场景下的性能, 我们可以把读和写进行分离,从而提升读和写的整体性能。
而为了达到读写分离的目的,在数据库层面必然需要把一个库拆分成多个库,一个库负责接收事务请求,另一个库负责接收读请求,如下图所示:
而如果我们想要实现读写分离,那首先需要搭建主从复制的数据库模式。
这里可以参考我的另外一篇文章记录,搭建完主从复制之后,我们再来逐步实现读写分离。
https://blog.csdn.net/qq_41432730/article/details/122355184
当我们实现了主从复制之后就可以开始本文的实战了。
本文只记录实现的主要步骤,具体代码地址会放在文末。如果对你有帮助,希望三连哦~
使用Idea直接创建spring boot项目即可。
主要是数据库,连接池以及shardingsphere的依赖。
<dependency>
<groupId>org.apache.shardingspheregroupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starterartifactId>
<version>5.0.0-alphaversion>
dependency>
<dependency>
<groupId>com.zaxxergroupId>
<artifactId>HikariCPartifactId>
<version>3.4.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<scope>runtimescope>
dependency>
业务代码相对简单,是使用mybatis-plus直接生成的,就一个对单表的增加及查询操作,这里就不过多阐述。
配置文件需要配置两个数据源,分表是写库以及读库。这里没有配置相关的分片规则,只是简单演示读写分离的场景。
写库配置为master,读库配置为salve。需要根据你们的配置自行修改;
server.port=8080
spring.mvc.view.prefix=classpath:/templates/
spring.mvc.view.suffix=.html
spring.shardingsphere.props.sql-show=true
spring.shardingsphere.datasource.names="write-ds,read-ds"
spring.shardingsphere.datasource.common.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.common.driver-class-name=com.mysql.jdbc.Driver
# 修改主数据库地址
spring.shardingsphere.datasource.write-ds.jdbc-url=jdbc:mysql://localhost:3306/mysalve?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.datasource.write-ds.username=root
spring.shardingsphere.datasource.write-ds.password=123456
# 从数据库地址
spring.shardingsphere.datasource.read-ds.jdbc-url=jdbc:mysql://localhost:3306/mysalve?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.datasource.read-ds.username=root
spring.shardingsphere.datasource.read-ds.password=123456
# db0这个名字随意定义,就是一个逻辑库的名字
spring.shardingsphere.rules.replica-query.data-sources.db0.primary-data-source-name=write-ds
spring.shardingsphere.rules.replica-query.data-sources.db0.replica-data-source-names=read-ds
# 负载均衡 轮询机制
spring.shardingsphere.rules.replica-query.load-balancers.db0.type=ROUND_ROBIN
#无任何意义,可能是没完善的地方?
spring.shardingsphere.rules.replica-query.load-balancers.db0.props.test=test
上述配置都完成后,我们直接启动项目即可。
总共两个接口,一个是数据的插入,一个是数据的查询。接下来我们分别执行两个接口:
以上便是我们通过Sharding JDBC实现读写分离的全部流程。
https://gitee.com/cl1429745331/sharding-jdbc-demo