Spring Boot 读写分离实现
原理
实现方式主要是通过扩展Spring AbstractRoutingDataSource
这个类充当DataSource路由中介,在运行当中根据自定义KEY值动态切换正真的DataSource。
具体实现
创建测试库、表:
create database `mytest_db`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL DEFAULT '' COMMENT '用户名',
`password` varchar(32) NOT NULL DEFAULT '' COMMENT '密码',
`email` varchar(64) NOT NULL DEFAULT '' COMMENT '邮箱',
`mobile` varchar(16) NOT NULL DEFAULT '' COMMENT '手机号',
`sex` tinyint(1) NOT NULL DEFAULT '1' COMMENT '性别 0 女 1男',
`point` int(11) NOT NULL DEFAULT '0' COMMENT '用户积分',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`last_update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
;
Spring DataSource 配置:
刚开始使用全注解版实现DataSource配置,后面发现需要增加从库还需要改代码,最终选择了使用配置文件。注解版后面我也会贴出来。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
...省略
...省略
...省略
slave1
slave2
注解版数据源配置
/**
* 多数据源配置,此方式省去配置文件,但灵活性不够
* Created by rain.wen on 2017/7/31.
*/
@Configuration
public class DataSourceConfiguration {
@Bean(name = "masterDataSource", destroyMethod = "close", initMethod = "init")
[@Primary](https://my.oschina.net/primary) // 这个注解表示主数据源
@ConfigurationProperties(prefix = "druid.datasource")
public DataSource datasource() {
return new DruidDataSource();
}
@Bean(name = "slaveDataSource", destroyMethod = "close", initMethod = "init")
@ConfigurationProperties(prefix = "druid.datasource2")
public DataSource datasource2() {
return new DruidDataSource();
}
/**
* 构建动态数据源
* @param masterDataSource
* @param slaveDataSource
* @return
*/
@Bean
public DynamicDataSource dynamicDataSource(@Qualifier("masterD