使用SpringBoot动态切换数据源的实现方式

 更新时间:2023年12月17日 09:30:41   作者:mntalk  
在我们企业项目开发的过程中,有的时候,一个项目需要在运行时,根据某种条件选择使用哪个数据源,那么此时该怎么进行动态切换呢,本文给大家例举一种常见的实现方式,文中有详细的实现步骤,需要的朋友可以参考下

1. 配置多数据源

在application.properties文件中配置多个数据源的连接信息,例如:

# 数据源1
spring.datasource.url=jdbc:mysql://localhost:3306/db1
spring.datasource.username=user1
spring.datasource.password=password1

# 数据源2
spring.datasource.db2.url=jdbc:mysql://localhost:3306/db2
spring.datasource.db2.username=user2
spring.datasource.db2.password=password2

这里以properties配置文件为例,yaml配置文件同理配置即可,下面不再说明!

2. 创建多个数据源配置类

为数据源创建一个配置类,分别配置数据源的连接信息和相关的Bean。例如:

@Configuration
public class DataSource1Config {
	// 数据源1
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }

	// 数据源2
	@Bean
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }
}

注意:该配置类必须在启动类同级目录下,或同级子目录下,否则项目启动时,无法将bean添加到Spring容器中!

3. 创建数据源切换类

创建一个数据源切换类,用于在运行时动态切换数据源。例如:

public class DataSourceContextHolder {
	// 数据源容器
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
	
	// 设置数据源
    public static void setDataSource(String dataSource) {
        contextHolder.set(dataSource);
    }
	
	// 获取数据源
    public static String getDataSource() {
        return contextHolder.get();
    }
	
	// 移除数据源
    public static void clearDataSource() {
        contextHolder.remove();
    }
}

4. 创建注解

创建注解,在需要动态切换的方法上使用,例如:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSourceSwitch {
    String value() default "defaultDataSource";
}

5. 创建数据源切换切面

使用AOP切面,在每个需要切换数据源的方法上进行切面处理。例如:

@Aspect
@Component
public class DataSourceSwitchAspect {
    
    // 这里的注解路径根据你自己的路径填写
    @Before("@annotation(com.example.demo.annotation.DataSourceSwitch)")
    public void switchDataSource(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        DataSourceSwitch dataSourceSwitch = method.getAnnotation(DataSourceSwitch.class);
        String dataSource = dataSourceSwitch.value();
        DataSourceContextHolder.setDataSource(dataSource);
    }

    // 这里的注解路径根据你自己的路径填写
    @After("@annotation(com.example.demo.annotation.DataSourceSwitch)")
    public void restoreDataSource(JoinPoint joinPoint) {
        DataSourceContextHolder.clearDataSource();
    }
}

6. 在需要切换数据源的方法上添加注解

在需要切换数据源的方法上添加@DataSourceSwitch注解,并指定要切换的数据源名称。例如:

@DataSourceSwitch("db2")
public void doSomething() {
    // 执行自己的业务逻辑
}

以上就是使用Spring Boot动态切换数据源的一种常见实现方式。通过配置多个数据源和使用AOP切面,在运行时动态切换数据源,实现了动态切换数据源的功能,如有问题或建议,欢迎留言讨论!

到此这篇关于使用SpringBoot动态切换数据源的实现方式总结的文章就介绍到这了,更多相关SpringBoot动态切换数据源内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用jd-gui反编译修改jar包里的.class并重新生成新jar问题

    使用jd-gui反编译修改jar包里的.class并重新生成新jar问题

    这篇文章主要介绍了使用jd-gui反编译修改jar包里的.class并重新生成新jar问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java Date(日期)对象进行格式化的思路详解

    Java Date(日期)对象进行格式化的思路详解

    Date类是经常会使用到的一个用来处理日期、时间的一个类。Date类是在java.util包下的Date类,这篇文章主要介绍了Java Date(日期)对象如何进行格式化呢,需要的朋友可以参考下
    2022-09-09
  • Java 网络爬虫新手入门详解

    Java 网络爬虫新手入门详解

    这篇文章主要介绍了Java 网络爬虫新手入门详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java文件操作工具类fileUtil实例【文件增删改,复制等】

    Java文件操作工具类fileUtil实例【文件增删改,复制等】

    这篇文章主要介绍了Java文件操作工具类fileUtil,结合实例形式分析了java针对文件进行读取、增加、删除、修改、复制等操作的相关实现技巧,需要的朋友可以参考下
    2017-10-10
  • 解析Java程序中对象内存的分配和控制的基本方法

    解析Java程序中对象内存的分配和控制的基本方法

    这篇文章主要介绍了解析Java程序中对象内存的分配和控制的基本方法,包括计算对象的内存占用的方法,要的朋友可以参考下
    2016-04-04
  • github上的java项目怎么运行(面向小白)

    github上的java项目怎么运行(面向小白)

    这篇文章主要介绍了github上的java项目怎么运行(面向小白),今天从github把我以前写的一个小demo下载下来了,第一次下载项目,摸索了一个多小时,才运行起来,需要的朋友可以参考下
    2019-06-06
  • 使用Java实现HTTP和HTTPS代理服务详解

    使用Java实现HTTP和HTTPS代理服务详解

    这篇文章主要为大家详细介绍了如何使用Java实现HTTP和HTTPS代理服务,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • springboot3.2整合mybatis-plus详细代码示例

    springboot3.2整合mybatis-plus详细代码示例

    这篇文章主要给大家介绍了关于springboot3.2整合mybatis-plus的相关资料,Spring Boot是一个非常流行的Java Web框架,可以快速地搭建Web应用程序,需要的朋友可以参考下
    2023-12-12
  • 浅谈@RequestMapping注解的注意点

    浅谈@RequestMapping注解的注意点

    这篇文章主要介绍了浅谈@RequestMapping注解的注意点,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot Druid配置过程图解

    SpringBoot Druid配置过程图解

    这篇文章主要介绍了SpringBoot Druid配置过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论