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