SpringBoot中配置多数据源的方法详解

 更新时间:2024年02月03日 08:16:33   作者:哪里的破水瓶  
这篇文章主要为大家详细介绍了SpringBoot中配置多数据源的方法的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

开始配置多数据源

首先我们需要先移除自动配置数据源,SpringBoot 的默认行为

DataSourceAutoConfiguration 是 SpringBoot 提供的自动配置类

@SpringBootApplication(scanBasePackages = "com", exclude = {DataSourceAutoConfiguration.class})

下面首先读取了默认数据源的信息,通过 getProperties() 封装成一个 Map 对象

定义了一个名为 dynamicDataSource 的 bean 是数据源路由器,它继承了 AbstractRoutingDataSource 类,我们可以根据规则选择要使用的数据源。

dataSource 方法接受一个 Map,并返回一个数据源,于是我们就创建了一个数据源

这段代码通过设置,配置了一个支持动态切换的数据源,默认使用 master,用于运行时动态切换数据源。

@Configuration
@Slf4j
public class DataSourceConfigurer {

    @Value("${spring.datasource.druid.master.url}")
    private String url;

    @Value("${spring.datasource.druid.master.username}")
    private String username;

    @Value("${spring.datasource.druid.master.password}")
    private String password;

    @Value("${spring.datasource.driverClassName}")
    private String driverClassName;

    /**
     * 获取数据源配置信息
     *
     * @return 数据源配置信息
     */
    private Map<String, Object> getProperties() {
        Map<String, Object> map = new HashMap<>();
        map.put("driverClassName", driverClassName);
        map.put("url", url);
        map.put("username", username);
        map.put("password", password);
        return map;
    }

    /**
     * 配置动态数据源
     *
     * @return 动态数据源
     */
    @Bean("dynamicDataSource")
    public DynamicRoutingDataSource dynamicDataSource() {
        DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
        
        // 创建数据源
        DataSource dataSource = dynamicRoutingDataSource.dataSource(getProperties());
        
        // 设置数据源映射
        Map<Object, Object> dataSourceMap = new HashMap<>(1);
        dataSourceMap.put("default_db", dataSource);
        dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);
        
        // 设置默认数据源
        dynamicRoutingDataSource.setDefaultTargetDataSource(dataSource);
        
        return dynamicRoutingDataSource;
    }
}

具体切换多数据源的逻辑 DynamicRoutingDataSource

多数据源切换的实现的关键是 AbstractRoutingDataSource

我们这里创建了一个 targetTargetDataSources 是一个 Map 存储数据源的数据,key 数据源的标识,value 是具体的数据源。通过 setTargetDataSources 可以设置数据源,在运行时,通过该方法切换。

通过 addDataSource 添加数据源,并通过 setTargetDataSources 使数据源生效。

existDataSource 是判断数据源是否存在

dataSource 这个是重要的方法,它是为数据源在druid 连接池中创建了资源,配置了数据源。

/**
 * 动态数据源
 */
@Slf4j
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {

    private static Map<Object, Object> targetTargetDataSources = new ConcurrentHashMap<>();

    @Override
    protected Object determineCurrentLookupKey() {
        // 每次连接数据库,都会去设置数据源
        return DynamicDataSourceContextHolder.getDataSourceKey();
    }

    // 设置targetDataSources并记录数据源(这里可以记录每个数据源的最近使用时间,可以做删除不经常使用的数据源)
    @Override
    public void setTargetDataSources(Map<Object, Object> targetDataSources) {
        super.setTargetDataSources(targetDataSources);
        super.afterPropertiesSet();
        targetTargetDataSources = targetDataSources;
    }

    // 添加数据源
    public void addDataSource(String tenant, Map<String, Object> dataSourceProperties) {
        targetTargetDataSources.put(tenant, dataSource(dataSourceProperties));
        super.setTargetDataSources(targetTargetDataSources);
        afterPropertiesSet();
    }

    // 判断是否存在数据源,存在直接取
    public boolean existDataSource(String tenant) {
        return targetTargetDataSources.containsKey(tenant);
    }

    // 组装数据源
    public DataSource dataSource(Map<String, Object> dataSourceProperties) {
        DataSource dataSource;
        try {
            dataSource = DruidDataSourceFactory.createDataSource(dataSourceProperties);
        } catch (Exception e) {
            log.error("dataSource: {}", e.getMessage());
            throw new RuntimeException();
        }
        return dataSource;
    }
}

到此这篇关于SpringBoot中配置多数据源的方法详解的文章就介绍到这了,更多相关SpringBoot配置多数据源内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Spring开发之自定义标签及其解析

    基于Spring开发之自定义标签及其解析

    Spring框架是现在Java最流行的开源框架之一,需要实现一些自定义的标签,主要是方便使用我们框架的人能够快速、简单进行配置,有兴趣的可以了解一下。
    2017-04-04
  • 解读spring.factories文件配置详情

    解读spring.factories文件配置详情

    这篇文章主要介绍了解读spring.factories文件配置详情,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • 详解spring boot starter redis配置文件

    详解spring boot starter redis配置文件

    spring-boot-starter-Redis主要是通过配置RedisConnectionFactory中的相关参数去实现连接redis service。下面通过本文给大家介绍在spring boot的配置文件中redis的基本配置,需要的的朋友参考下
    2017-07-07
  • SpringBoot框架aop切面的execution表达式解读

    SpringBoot框架aop切面的execution表达式解读

    这篇文章主要介绍了SpringBoot框架aop切面的execution表达式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java异常javax.net.ssl.SSLHandshakeException: SSL的解决方法

    Java异常javax.net.ssl.SSLHandshakeException: SSL的解决方法

    在Java开发过程中,SSL(Secure Sockets Layer)握手异常是一个常见的网络通信错误,特别是在使用HTTPS协议进行安全通信时,本文将详细分析javax.net.ssl.SSLHandshakeException: SSL这一异常的背景、可能的原因,并通过代码示例帮助您理解和解决这一问题
    2024-12-12
  • Java中replace的用法实例讲解

    Java中replace的用法实例讲解

    这篇文章主要给大家介绍了关于Java中replace用法的相关资料,Java中的replace方法是用于字符串替换的方法,它可以接受两个参数,第一个参数是需要被替换的字符串,第二个参数是替换后的字符串,需要的朋友可以参考下
    2024-04-04
  • Java面向对象之多态

    Java面向对象之多态

    这篇文章主要介绍了Java面向对象之多态,文章以什么是多态、多态的实现条件、多态的访问特点、多态的优点和缺点的相关资料展开文章内容,需要的小伙伴可以参考一下
    2021-10-10
  • Java实现获取服务器资源(内存,负载,磁盘容量)

    Java实现获取服务器资源(内存,负载,磁盘容量)

    这篇文章主要为大家详细介绍了如何Java实现获取服务器资源信息,包括内存,负载,磁盘容量等内容,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • Feign实现多文件上传,Open Feign多文件上传问题及解决

    Feign实现多文件上传,Open Feign多文件上传问题及解决

    这篇文章主要介绍了Feign实现多文件上传,Open Feign多文件上传问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 在Linux系统上升级Java版本的两种方法步骤

    在Linux系统上升级Java版本的两种方法步骤

    由于项目升级,需要将JDK7升级到JDK8,升级JDK的同时也要升级一些其他的版本,下面这篇文章主要给大家介绍了关于在Linux系统上升级Java版本的两种方法步骤,需要的朋友可以参考下
    2024-09-09

最新评论