SpringBoot+MyBatis+MySQL读写分离实现
作者 |废物大师兄
来源 | urlify.cn/f6F7je
1. 引言
读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行 , 至于谁来做选择数据库这件事儿 , 无非两个 , 要么中间件帮我们做 , 要么程序自己做 。 因此 , 一般来讲 , 读写分离有两种实现方式 。 第一种是依靠中间件(比如:MyCat) , 也就是说应用程序连接到中间件 , 中间件帮我们做SQL分离;第二种是应用程序自己去做分离 。 这里我们选择程序自己来做 , 主要是利用Spring提供的路由数据源 , 以及AOP
然而 , 应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点 , 因为数据源配置都是写在配置中的 , 新增数据库意味着新加一个数据源 , 必然改配置 , 并重启应用 。 当然 , 好处就是相对简单 。
文章插图
2. AbstractRoutingDataSource
基于特定的查找key路由到特定的数据源 。 它内部维护了一组目标数据源 , 并且做了路由key与目标数据源之间的映射 , 提供基于key查找数据源的方法 。
文章插图
3. 实践
关于配置请参考《MySQL主从复制配置》
3.1. maven依赖
3.2. 数据源配置
application.yml
spring:datasource:master:jdbc-url: jdbc:mysql://192.168.102.31:3306/testusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave1:jdbc-url: jdbc:mysql://192.168.102.56:3306/testusername: pig# 只读账户password: 123456driver-class-name: com.mysql.jdbc.Driverslave2:jdbc-url: jdbc:mysql://192.168.102.36:3306/testusername: pig# 只读账户password: 123456driver-class-name: com.mysql.jdbc.Driver
多数据源配置
package com.cjs.example.config;import com.cjs.example.bean.MyRoutingDataSource;import com.cjs.example.enums.DBTypeEnum;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.jdbc.DataSourceBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;import java.util.HashMap;import java.util.Map;/** * 关于数据源配置 , 参考SpringBoot官方文档第79章《Data Access》 * 79. Data Access * 79.1 Configure a Custom DataSource * 79.2 Configure Two DataSources */@Configurationpublic class DataSourceConfig {@Bean@ConfigurationProperties("spring.datasource.master")public DataSource masterDataSource() {return DataSourceBuilder.create().build();}@Bean@ConfigurationProperties("spring.datasource.slave1")public DataSource slave1DataSource() {return DataSourceBuilder.create().build();}@Bean@ConfigurationProperties("spring.datasource.slave2")public DataSource slave2DataSource() {return DataSourceBuilder.create().build();}@Beanpublic DataSource myRoutingDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,@Qualifier("slave1DataSource") DataSource slave1DataSource,@Qualifier("slave2DataSource") DataSource slave2DataSource) {Map
- 订阅|手淘大改版:商家可被“订阅”内容种草与购买转化分离
- 分离基础|数据中心融合的过去、现在和未来
- 行业|工业气体需求增加,空气分离设备行业市场规模有望进一步扩大
- python文件读写模式,覆盖写和清空写你清楚了吗
- 国产良心SSD读写不虚标,379元入手512G,8秒开机
- 群联第二代PCIe 4.0 SSD主控E18性能曝光:读写均超7GB/s
- 东风集团要猛攻换电?将与国网成立合资公司探索“车电分离”模式
- 荣耀终端有限公司|荣耀成立多家分公司 与华为分离构建新架构
- 设计数据库集群读写分离并非易事
- 集团|东风集团与国家电网战略合作,推出车电分离商业模式