使用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动态切换数据源内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java数据结构之有效队列定义与用法示例

    Java数据结构之有效队列定义与用法示例

    这篇文章主要介绍了Java数据结构之有效队列定义与用法,结合实例形式分析了java有效队列的数据插入、删除、判断、计算等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • java中关于移位运算符的demo与总结(推荐)

    java中关于移位运算符的demo与总结(推荐)

    下面小编就为大家带来一篇java中关于移位运算符的demo与总结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • Java 开发中 for和Stream用法对比分析

    Java 开发中 for和Stream用法对比分析

    本文介绍了for循环和Stream在Java编程中的使用场景和区别,for循环适用于简单的遍历、中途退出、操作索引等场景,而Stream适用于多步骤数据处理、复杂逻辑、并行计算等场景,下面通过例子给大家详细讲解,感兴趣的朋友一起看看吧
    2026-03-03
  • springboot读取自定义配置文件节点的方法

    springboot读取自定义配置文件节点的方法

    这篇文章主要介绍了springboot读取自定义配置文件节点的方法,本文给大家介绍的非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-05-05
  • springboot使用Logback把日志输出到控制台或输出到文件

    springboot使用Logback把日志输出到控制台或输出到文件

    这篇文章给大家介绍springboot项目使用日志工具Logback把日志不仅输出到控制台,也可以输出到文件的操作方法,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-10-10
  • SpringBoot中application.yml基本配置解读

    SpringBoot中application.yml基本配置解读

    文章主要介绍了Spring Boot项目中`application.properties`和`application.yml`配置文件的使用方法和区别,包括优先级、配置文件所在目录、端口服务配置、数据库配置、多profile配置以及静态资源路径的指定
    2024-12-12
  • 在Spring Boot中从类路径加载文件的示例

    在Spring Boot中从类路径加载文件的示例

    创建Spring Boot Web应用程序时,有时有时需要从类路径中加载文件;war和jar的加载文件格式是不一样的,在下面,您将找到在WAR和JAR中加载文件的解决方案。
    2020-10-10
  • HashMap中哈希值与数组坐标的关联方式

    HashMap中哈希值与数组坐标的关联方式

    这篇文章主要介绍了HashMap中哈希值与数组坐标的关联方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • springboot3.2整合mybatis-plus详细代码示例

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

    这篇文章主要给大家介绍了关于springboot3.2整合mybatis-plus的相关资料,Spring Boot是一个非常流行的Java Web框架,可以快速地搭建Web应用程序,需要的朋友可以参考下
    2023-12-12
  • Springboot+Spring Security实现前后端分离登录认证及权限控制的示例代码

    Springboot+Spring Security实现前后端分离登录认证及权限控制的示例代码

    本文主要介绍了Springboot+Spring Security实现前后端分离登录认证及权限控制的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11

最新评论