springboot 多数据源之间切换

1.yml配置多个数据源

2.添加以下几个类

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.stereotype.Component;

import com.alibaba.druid.pool.DruidDataSource;

@Component
public class CustomRoutingDataSource extends AbstractRoutingDataSource {

    @Resource(name = "writeDataSourceProperties")
    private DataSourceProperties writeProperties;

    @Resource(name = "readDataSourceProperties")
    private DataSourceProperties readProperties;
    
    @Resource(name = "logDataSourceProperties")
    private DataSourceProperties logProperties;


    @Override
    public void afterPropertiesSet() {
        DataSource writeDataSource = 
            writeProperties.initializeDataSourceBuilder().type(DruidDataSource.class).build();
        DataSource readDataSource = 
            readProperties.initializeDataSourceBuilder().type(DruidDataSource.class).build();
        DataSource logDataSource = 
    		logProperties.initializeDataSourceBuilder().type(DruidDataSource.class).build();
        
        setDefaultTargetDataSource(writeDataSource);

        Map<Object, Object> dataSourceMap = new HashMap<>();
        dataSourceMap.put(DataSourceHolder.WRITE_DATASOURCE, writeDataSource);
        dataSourceMap.put(DataSourceHolder.READ_DATASOURCE, readDataSource);
        dataSourceMap.put(DataSourceHolder.LOG_DATASOURCE, logDataSource);
        setTargetDataSources(dataSourceMap);

        super.afterPropertiesSet();
    }

    @Override
    protected Object determineCurrentLookupKey() {
        String key = DataSourceHolder.getDataSource();

        if (key == null) {
             // default datasource
            return DataSourceHolder.WRITE_DATASOURCE;
        }

        return key;
    }

}

public class DataSourceHolder {
	public static final String WRITE_DATASOURCE = "write";
    public static final String READ_DATASOURCE = "read";
    public static final String LOG_DATASOURCE = "log";

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


    public static void putDataSource(String dataSource) {
        local.set(dataSource);
    }

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

    public static void clearDataSource() {
        local.remove();
    }

}


import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class DataSourcePropertiesConfig {
	 	@Primary
	    @Bean("writeDataSourceProperties")
	    @ConfigurationProperties("spring.datasource.write")
	    public DataSourceProperties writeDataSourceProperties() {
	        return new DataSourceProperties();
	    }

	    @Bean("readDataSourceProperties")
	    @ConfigurationProperties("spring.datasource.read")
	    public DataSourceProperties readDataSourceProperties() {
	        return new DataSourceProperties();
	    }
	    
	    @Bean("logDataSourceProperties")
	    @ConfigurationProperties("spring.datasource.log")
	    public DataSourceProperties logDataSourceProperties() {
	        return new DataSourceProperties();
	    }
}

3.数据源切换到从表

DataSourceHolder.putDataSource(DataSourceHolder.LOG_DATASOURCE);

4.完成之后需要clear

DataSourceHolder.clearDataSource();


版权声明:本文为qq_38497071原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。