public String getDataSource(DataSourceEntity dataSourceEntity) {
DruidDataSource druidDataSource = new DruidDataSource( );
druidDataSource.setUrl(dataSourceEntity.getUrl());
druidDataSource.setUsername(dataSourceEntity.getUserName());
druidDataSource.setPassword(dataSourceEntity.getPassWord());
druidDataSource.setDriverClassName(dataSourceEntity.getDriverClassName());
druidDataSource.setValidationQuery(“select 1 from dual”);
try{
druidDataSource.init();
DynamicDataSource.dataSourcesMap.put(dataSourceEntity.getKey(), druidDataSource);
DynamicDataSource.setDataSource(dataSourceEntity.getKey());
return “success”;
}catch (Exception e){
druidDataSource.close();
return “error”;
}
}
package com.example.demo.Dynamic;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
-
使用步骤:
-
-
DynamicDataSource.dataSourcesMap.put(dataSourceKey, druidDataSource);
-
DynamicDataSource.setDataSource(dataSourceKey);
-
调用业务代码</i>
-
DynamicDataSource.clear();
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal<String> dataSourceKey = ThreadLocal.withInitial(() -> "defaultDataSource");
public static Map<Object, Object> dataSourcesMap = new ConcurrentHashMap<>(10);
static {
dataSourcesMap.put("defaultDataSource", SpringUtils.getBean("defaultDataSource"));
}
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSource.dataSourceKey.get();
}
public static void setDataSource(String dataSource) {
DynamicDataSource.dataSourceKey.set(dataSource);
DynamicDataSource dynamicDataSource = (DynamicDataSource) SpringUtils.getBean("dataSource");
dynamicDataSource.afterPropertiesSet();
}
public static String getDataSource() {
return DynamicDataSource.dataSourceKey.get();
}
public static void clear() {
DynamicDataSource.dataSourceKey.remove();
}
}
package com.example.demo.Dynamic;
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 javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.druid")
public DataSource defaultDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@Primary
@DependsOn({"springUtils", "defaultDataSource"})
public DynamicDataSource dataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setTargetDataSources(DynamicDataSource.dataSourcesMap);
return dynamicDataSource;
}
}
package com.example.demo.Dynamic;
import com.alibaba.druid.pool.DruidDataSource;
import com.example.demo.entity.DataSourceEntity;
import com.example.demo.service.DataSourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.sql.SQLException;
import java.util.List;
/**
-
@author lgx
-
@date 2020/6/8 11:55
*/
@Component
public class LoadDataSource implements CommandLineRunner {
@Autowired
private DataSourceService sourceService;
@Override
public void run(String… args) throws Exception {
System.out.println(“开始加载数据库”);
List dataSourceEntities = sourceService.loadData();
for(DataSourceEntity dataSourceEntity:dataSourceEntities){
DynamicDataSource.dataSourcesMap.put(dataSourceEntity.getKey(),druidDataSourceDefaultConfig(dataSourceEntity));
}
System.out.println( DynamicDataSource.dataSourcesMap);
}private DruidDataSource druidDataSourceDefaultConfig(DataSourceEntity dataSourceEntity) throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(dataSourceEntity.getDriverClassName());
druidDataSource.setUsername(dataSourceEntity.getUserName());
druidDataSource.setPassword(dataSourceEntity.getPassWord());
druidDataSource.setUrl(dataSourceEntity.getUrl());
//其他相关配置
//获取连接失败后不进入循环
druidDataSource.setBreakAfterAcquireFailure(true);
//长时间闲置关闭连接
druidDataSource.setRemoveAbandoned(true);
//长时间闲置超时时间
druidDataSource.setRemoveAbandonedTimeout(60);
//记录关闭信息
druidDataSource.setLogAbandoned(true);
//初始化建立连接数量
druidDataSource.setInitialSize(1);
//获取连接最大等待时间
druidDataSource.setMaxWait(2000);
//最大连接数量
druidDataSource.setMaxActive(10);
//检测连接的sql
druidDataSource.setValidationQuery(“select 1 from dual”);
//每30秒检测一次连接状态
druidDataSource.setValidationQueryTimeout(30);
//申请连接的时候检测
druidDataSource.setTestWhileIdle(true);
//上边使用
druidDataSource.setTimeBetweenEvictionRunsMillis(60000);
//PSCache
druidDataSource.setPoolPreparedStatements(true);
//PSCache最大数量
druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(50);
//保活
druidDataSource.setKeepAlive(true);
druidDataSource.setMinEvictableIdleTimeMillis(30000);
druidDataSource.setMaxEvictableIdleTimeMillis(60000);return druidDataSource;
}
}
package com.example.demo.Dynamic;
import lombok.Getter;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public final class SpringUtils implements ApplicationContextAware {
@Getter
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringUtils.applicationContext == null) {
SpringUtils.applicationContext = applicationContext;
}
}
public static <T> T getBean(Class<T> clazz) {
return SpringUtils.applicationContext.getBean(clazz);
}
public static Object getBean(String name) {
return SpringUtils.applicationContext.getBean(name);
}
public static String getProperty(String key) {
return SpringUtils.applicationContext.getEnvironment().getProperty(key);
}
}