我是靠谱客的博主 大气果汁,最近开发中收集的这篇文章主要介绍手动实现MySql动态数据源配置,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MySql动态数据源配置实践

环境

Spring Boot项目作为主体框架,使用Mybatis-Plus作为操作数据库框架。

思路

  • 通过配置文件配置数据源,Spring在启动的时候自动将配置好的多数据源加载到容器。
  • 使用Spring-Boot-starter-JDBC依赖里面的AbstractRoutingDataSource类进行实现。
  • 编写配置类,将自动注入的数据源设置到AbstractRoutingDataSource类的TargetDataSources。
  • 实现AbstractRoutingDataSource类的determineCurrentLookupKey(),使用ThreadLocal进行数据库切换。

特点

  • 可以根据传入参数不同,进行数据源切换。

代码

pom依赖

 <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
</dependencies>

配置

server:
port: 8888
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
#
第一个数据源
datasource1:
url: jdbc:mysql://192.168.244.100:3306/study1?serverTimezone=UTC
username: root
password: root
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
driver-class-name: com.mysql.cj.jdbc.Driver
#
第二个数据源
datasource2:
url: jdbc:mysql://192.168.244.100:3306/study2?serverTimezone=UTC
username: root
password: root
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
driver-class-name: com.mysql.cj.jdbc.Driver

核心实现

数据源加载配置
@Configuration
public class LoadDataSourceConfig {
@Bean(name = "dataSource1")
@ConfigurationProperties(prefix = "spring.datasource.datasource1")
public DataSource dataSource1(){
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.datasource2")
public DataSource dataSource2(){
return DruidDataSourceBuilder.create().build();
}
}
动态数据源配置
@Component("dynamicDataSource")
@Primary
public class DynamicDataSourceConfig extends AbstractRoutingDataSource {
public static ThreadLocal<String> dataBaseName = new ThreadLocal<>();
@Resource(name = "dataSource1")
DataSource dataSource1;
@Resource(name = "dataSource2")
DataSource dataSource2;
@Override
protected Object determineCurrentLookupKey() {
return dataBaseName.get();
}
@Override
public void afterPropertiesSet() {
HashMap<Object, Object> map = new HashMap<>();
map.put("write",dataSource1);
map.put("read",dataSource2);
// 设置数据源
super.setTargetDataSources(map);
// 设置默认库
super.setDefaultTargetDataSource(dataSource1);
super.afterPropertiesSet();
}
}

使用

@Controller
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentMapper studentMapper;
@RequestMapping(value = "/save",method = RequestMethod.GET)
public String saveStudent(@RequestParam(name= "name") String name,@RequestParam(name= "sex") String sex,@RequestParam(name= "ds",defaultValue = "write") String ds){
DynamicDataSourceConfig.dataBaseName.set(ds);
Student student = new Student();
student.setName(name);
student.setSex(sex);
student.setCreateTime(LocalDateTime.now());
studentMapper.insert(student);
return "success!!";
}
@RequestMapping(value = "/get",method = RequestMethod.GET)
@ResponseBody
public Student query(@RequestParam(name = "id") String id,@RequestParam(name= "ds",defaultValue = "read") String ds){
DynamicDataSourceConfig.dataBaseName.set(ds);
return studentMapper.selectById(id);
}
}

源码地址:https://gitee.com/sihehe/spring-mysql.git

最后

以上就是大气果汁为你收集整理的手动实现MySql动态数据源配置的全部内容,希望文章能够帮你解决手动实现MySql动态数据源配置所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部