SpringBoot+MyBatis+MySQL读写分离实现

作者 |废物大师兄
来源 | urlify.cn/f6F7je
1. 引言
读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行 , 至于谁来做选择数据库这件事儿 , 无非两个 , 要么中间件帮我们做 , 要么程序自己做 。 因此 , 一般来讲 , 读写分离有两种实现方式 。 第一种是依靠中间件(比如:MyCat) , 也就是说应用程序连接到中间件 , 中间件帮我们做SQL分离;第二种是应用程序自己去做分离 。 这里我们选择程序自己来做 , 主要是利用Spring提供的路由数据源 , 以及AOP
然而 , 应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点 , 因为数据源配置都是写在配置中的 , 新增数据库意味着新加一个数据源 , 必然改配置 , 并重启应用 。 当然 , 好处就是相对简单 。
SpringBoot+MyBatis+MySQL读写分离实现文章插图
2. AbstractRoutingDataSource
基于特定的查找key路由到特定的数据源 。 它内部维护了一组目标数据源 , 并且做了路由key与目标数据源之间的映射 , 提供基于key查找数据源的方法 。
SpringBoot+MyBatis+MySQL读写分离实现文章插图
3. 实践
关于配置请参考《MySQL主从复制配置》
3.1. maven依赖
4.0.0com.cjs.examplecjs-datasource-demo0.0.1-SNAPSHOTjarcjs-datasource-demoorg.springframework.bootspring-boot-starter-parent2.0.5.RELEASE UTF-8UTF-81.8org.springframework.bootspring-boot-starter-aoporg.springframework.bootspring-boot-starter-jdbcorg.springframework.bootspring-boot-starter-weborg.mybatis.spring.bootmybatis-spring-boot-starter1.3.2org.apache.commonscommons-lang33.8mysqlmysql-connector-javaruntimeorg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-plugin3.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