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版权协议,转载请附上原文出处链接和本声明。