springboot添加多数据源与动态切换

第一步加入POM

除去自己本身项目需要用得POM之外,还需要添加以下Druid连接依赖

 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

第二步配置spring


import lombok.Getter;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;


/**
 * <code>SpringUtil</code> spring工具类。
 *
 * @author PengXiuYuan
 * @date 2020-08-20
 * @since 1.0.0
 */
@Component
public class SpringUtil implements ApplicationContextAware {
    @Getter
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
        }
    }

    public static <T> T getBean(Class<T> clazz) {
        return SpringUtil.applicationContext.getBean(clazz);
    }

    public static Object getBean(String name) {
        return SpringUtil.applicationContext.getBean(name);
    }

    public static String getProperty(String key) {
        return SpringUtil.applicationContext.getEnvironment().getProperty(key);
    }
}

第三步配置数据源


import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

/**
 * <code>DataSourceConfig</code> 数据源配置。
 *
 * @author PengXiuYuan
 * @date 2020-08-20
 * @since 1.0.0
 */
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("spring.datasource.druid")

    public DataSource defaultDataSource() {
        DruidDataSource build = DruidDataSourceBuilder.create().build();
        return build;
    }

    @Bean
    @Primary
    @DependsOn({"springUtil", "defaultDataSource"})
    public DynamicDataSource dataSource()  {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        dynamicDataSource.setTargetDataSources(DynamicDataSource.dataSourcesMap);
        return dynamicDataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager()  {
        return new DataSourceTransactionManager(dataSource());

    }

第四步配置动态数据源


import com.dreawer.tdc.utils.SpringUtil;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * <code>DynamicDataSource</code> 动态数据源。
 *
 * @author PengXiuYuan
 * @date 2020-08-20
 * @since 1.0.0
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    private static final ThreadLocal<String> dataSourceKey = ThreadLocal.withInitial(() -> "defaultDataSource");

    public static Map<Object, Object> dataSourcesMap = new ConcurrentHashMap<>(20);

    static {
        dataSourcesMap.put("defaultDataSource", SpringUtil.getBean("defaultDataSource"));
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSource.dataSourceKey.get();
    }

    public static void setDataSource(String dataSource) {
        DynamicDataSource.dataSourceKey.set(dataSource);
        DynamicDataSource dynamicDataSource = (DynamicDataSource) SpringUtil.getBean("dataSource");
        dynamicDataSource.afterPropertiesSet();
    }

    public static String getDataSource() {
        return DynamicDataSource.dataSourceKey.get();
    }

    public static void clear() {
        DynamicDataSource.dataSourceKey.remove();
    }

第五步配置默认数据源

# DATASOURCE
spring.datasource.druid.default-auto-commit = true
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=
spring.datasource.password=
spring.datasource.url=

第六步实际运用

1.添加数据源

我做的就是连接不同环境的数据库,如果知道要连接哪些数据库可以先多次调用该方法先添加到数据源里面。

  /**
     * 设置数据源。
     * @param env 环境。
     * @param databaseName 数据源名称。
     * @author PengXiuYuan
     * @date 2020-08-20
     * @since 1.0.0
     */
    public void setDataSource(DataSourceEnvironment env, String databaseName) {
        DruidDataSource druidDataSource = new DruidDataSource();
        switch (env) {
            case DEV:
                if (StringUtils.isEmpty(databaseName)) {
                    databaseName = "testinfo_dev";
                }
                druidDataSource.setUrl(String.format(devDataSourceUrl, databaseName));
                druidDataSource.setUsername(devUserName);
                druidDataSource.setPassword(devPassword);
                break;

            case TEST3:
                if (StringUtils.isEmpty(databaseName)) {
                    databaseName = "cc-test3";
                }
                druidDataSource.setUrl(String.format(testDataSourceUrl, databaseName));
                druidDataSource.setUsername(testUserName);
                druidDataSource.setPassword(testPassword);
                break;

            case UAT:
                if (StringUtils.isEmpty(databaseName)) {
                    databaseName = "cc-uat";
                }
                druidDataSource.setUrl(String.format(uatDataSourceUrl, databaseName));
                druidDataSource.setUsername(uatUserName);
                druidDataSource.setPassword(uatPassword);
                break;
        }
        DynamicDataSource.dataSourcesMap.put(databaseName, druidDataSource);
        DynamicDataSource.setDataSource(databaseName);
    }

2.例子


    /**
     * 例子。
     * @author PengXiuYuan
     * @date 2020-08-20
     * @since 1.0.0
     */
    public void  test() {
        	//切换数据源,在此之前就已经添加到数据源里面
            DynamicDataSource.setDataSource(databaseName);
            //业务代码
            
            //关闭数据源
            DynamicDataSource.setDataSource(dataSource);
    }

自此就完成了多数据源添加与切换功能了,欢迎大家评论与交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Springboot中使用MongoDB多数据动态切换,可以通过以下步骤实现: 1. 添加MongoDB的依赖 在pom.xml文件中加入对spring-boot-starter-data-mongodb和mongodb-driver的依赖。 2. 配置多数据 在application.yml或application.properties中配置多个数据,如下所示: ``` spring: data: mongodb: uri: mongodb://localhost:27017/test1 database: test1 seconddata: mongodb: uri: mongodb://localhost:27017/test2 database: test2 ``` 其中第一个数据是默认的数据,第二个数据是自定义的数据。 3. 配置数据切换组件 在Springboot中使用MongoDB多数据需要使用MongoDbFactory和MongoTemplate两个组件。我们可以通过自定义MongoTemplate的方式来实现数据切换。具体实现可以参考以下代码: ```java @Configuration public class MultipleMongoConfig { @Bean(name = "firstMongoTemplate") @Primary public MongoTemplate firstMongoTemplate() throws Exception { return new MongoTemplate(firstFactory()); } @Bean(name = "secondMongoTemplate") public MongoTemplate secondMongoTemplate() throws Exception { return new MongoTemplate(secondFactory()); } @Bean @Primary public MongoDbFactory firstFactory() throws Exception { return new SimpleMongoDbFactory(new MongoClientURI( env.getProperty("spring.data.mongodb.uri"))); } @Bean public MongoDbFactory secondFactory() throws Exception { return new SimpleMongoDbFactory(new MongoClientURI( env.getProperty("seconddata.mongodb.uri"))); } } ``` 4. 动态切换数据 在需要切换数据的地方,可以通过注入MongoTemplate来实现。具体实现可以参考以下代码: ```java @Service public class UserServiceImpl implements UserService { @Autowired @Qualifier("firstMongoTemplate") private MongoTemplate firstMongoTemplate; @Autowired @Qualifier("secondMongoTemplate") private MongoTemplate secondMongoTemplate; public void save(User user) { if (user.isUseSecondDataSource()) { secondMongoTemplate.save(user); } else { firstMongoTemplate.save(user); } } public User findById(String id, boolean useSecondDataSource) { if (useSecondDataSource) { return secondMongoTemplate.findById(id, User.class); } else { return firstMongoTemplate.findById(id, User.class); } } } ``` 在上面的示例中,我们可以通过isUseSecondDataSource()方法来判断是否需要使用第二个数据。如果需要使用第二个数据,则使用secondMongoTemplate;否则使用firstMongoTemplate。 以上就是在Springboot中使用MongoDB多数据动态切换的全部步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值