springboot+mybatis实现动态切换数据源

本文介绍了在Spring Boot项目中配置多个数据源的方法,包括直接连接数据库和通过JNDI查找DataSource。然后,创建了一个DynamicDataSource类作为默认数据源,并实现了动态数据源切换。在Controller层,可以根据需求指定使用哪个数据源。动态数据源的切换是通过ThreadLocal变量实现的。
摘要由CSDN通过智能技术生成

由于目前项目中需要用到项目中的两个库,研究了一下发现一个比较轻松的写法。

首先配置多个数据源并且交给bean管理 写在 Config中

  @Bean(name = "db1")
    public DataSource druidDataSource() {
        DruidDataSource datasource = null;
        //直连数据库
        if ("0".equals(jndiflag)) {
            datasource = new DruidDataSource();
            datasource.setUrl(dbUrl);
            datasource.setUsername(username);
            datasource.setPassword(password);
            datasource.setDriverClassName(driverClassName);
            datasource.setInitialSize(initialSize);
            datasource.setMinIdle(minIdle);
            datasource.setMaxActive(maxActive);
            datasource.setMaxWait(maxWait);
            datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
            datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
            datasource.setValidationQuery(validationQuery);
            datasource.setTestWhileIdle(testWhileIdle);
            datasource.setTestOnBorrow(testOnBorrow);
            datasource.setTestOnReturn(testOnReturn);
            try {
                datasource.setFilters(filters);
            } catch (SQLException e) {
                log.error("druid configuration initialization filter", e);
            }
        } else {
            try {
                Context ctx = new InitialContext();
                datasource = (DruidDataSource) ctx.lookup("");
            } catch (NamingException e) {
                log.error("通过JNDI名称找到DataSource 异常", e);
            }
        }
        return datasource;
    }

    @Bean(name = "db2")
    public DataSource druidDataSourceTwo() {
        DruidDataSource datasource = null;
        //直连数据库
        if ("0".equals(jndiflag)) {
            datasource = new DruidDataSource();
            datasource.setUrl(dbUrlTwo);
            datasource.setUsername(usernameTwo);
            datasource.setPassword(passwordTwo);
            datasource.setDriverClassName(driverClassNameTwo);
            datasource.setInitialSize(initialSize);
            datasource.setMinIdle(minIdle);
            datasource.setMaxActive(maxActive);
            datasource.setMaxWait(maxWait);
            datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
            datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
            datasource.setValidationQuery(validationQuery);
            datasource.setTestWhileIdle(testWhileIdle);
            datasource.setTestOnBorrow(testOnBorrow);
            datasource.setTestOnReturn(testOnReturn);
            try {
                datasource.setFilters(filters);
            } catch (SQLException e) {
                log.error("druid configuration initialization filter", e);
            }
        } else {
            try {
                Context ctx = new InitialContext();
                datasource = (DruidDataSource) ctx.lookup("");
            } catch (NamingException e) {
                log.error("通过JNDI名称找到DataSource 异常", e);
            }
        }
        return datasource;
    }

目前配置了两个数据源后,我们也应该在Config 中指定一个默认数据源

@Bean(name = "dynamicDataSource")
    @Primary
    public DataSource dynamicDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        // 默认数据源
        dynamicDataSource.setDefaultTargetDataSource(db1);
        // 配置多数据源
        Map<Object, Object> dsMap = new HashMap<>();
        dsMap.put("db1", db1);
        dsMap.put("db2", db2);

        dynamicDataSource.setTargetDataSources(dsMap);
        return dynamicDataSource;
    }

以下是DynamicDataSource 类

package com.guobaojingrong.salesupport.config;/*
 * 消息描述
 * @Description: $
 * @return: $
 * @Author: 李
 * @Date: $ $
 */

import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

@Slf4j
public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        log.info("动态获取数据源——{}",DataSourceUtil.getDB());
        return DataSourceUtil.getDB();
    }
}
DataSourceUtil类
package com.guobaojingrong.salesupport.config;/*
 * 消息描述
 * @Description: $
 * @return: $
 * @Author: 李
 * @Date: $ $
 */

public class DataSourceUtil {

    private static final ThreadLocal<String> contextHolder = new ThreadLocal();

    /**
     * 设置数据源名
     * @param dbType
     */
    public static void setDB(String dbType) {
        contextHolder.set(dbType);
    }

    /**
     * 获取数据源名
     * @return
     */
    public static String getDB() {
        return contextHolder.get();
    }

    /**
     * 清除数据源名
     */
    public static void clearDB() {
        contextHolder.remove();
    }
}

在Controller 指定对应的库

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值