手动创建druid数据源,可以使用jdbc或者通过aspect进行多数据源的动态切换
通过md5加密创建唯一key,在key重复时不进行创建,
创建的数据源可以通过dataSourceKey进行bean获取,或者通过jdbctemplate对象进行操作
在druid页面中可以观测到注入的数据源
一、配置实体类-从数据库读取
二、数据源工厂
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
/**
* 数据源创建工厂
*
* @author luwl
* @date 2022/5/11 16:18
*/
@Slf4j
public class DataSourceFactory {
/**
* 本地数据源集合
*/
private static final List myDataSource = Collections.synchronizedList(new ArrayList<>());
private DataSourceFactory() {
}
private static final DataSourceFactory ME = new DataSourceFactory();
public static DataSourceFactory me() {
return ME;
}
private final int initialSize = 5;
private final int maxActive = 20;
private final int minIdle = 5;
private final int maxWait = 60 * 1000;
private final String validationQuery = "SELECT 1";
private final int validationQueryTimeout = 60 * 1000;
private final boolean testWhileIdle = true;
private final boolean testOnBorrow = false;
private final boolean testOnReturn = false;
private final boolean failFast = true;
private final int timeBetweenEvictionRunsMillis = 6 * 1000;
private final int timeBetweenConnectErrorMillis = 500;
private final int minEvictableIdleTimeMillis = 60 * 1000;
private final int maxEvictableIdleTimeMillis = 25200000;
private final boolean poolPreparedStatements = true;
private final boolean sharePreparedStatements = false;
private final boolean useGlobalDataSourceStat = true;
private final int maxPoolPreparedStatementPerConnectionSize = 20;
/**
* 创建数据源 如果数据源已存在不进行创建
*
* @param dataSourceConfig
*/
public void createDataSource(DataSourceConfig dataSourceConfig) {
//加入到缓存中
String dataSourceKey = dataSourceConfig.getDataSourceKey();
//获取默认数据源
DruidDataSource defaultDataSource = SpringHelper.getBean("dataSource");
if (myDataSource.size() == 0 && dataSourceConfig.getUrl().equals(defaultDataSource.getUrl())) {
log.warn("当前数据库连接与默认数据源一致,不进行数据源创建");
dataSourceKey = "dataSource";
myDataSource.add(dataSourceKey);
dataSourceConfig.setDataSourceKey(dataSourceKey);
return;
} else if (myDataSource.contains(dataSourceKey)) {
log.warn("当前数据库连接已存在,不进行数据源创建");
return;
}
Properties prop = new Properties();
prop.put("initialSize", initialSize);
prop.put("maxActive", maxActive);
prop.put("minIdle", minIdle);
prop.put("maxWait", maxWait);
prop.put("poolPreparedStatements", poolPreparedStatements);
prop.put("maxPoolPreparedStatementPerConnectionSize", maxPoolPreparedStatementPerConnectionSize);
prop.put("validationQuery", validationQuery);
prop.put("validationQueryTimeout", validationQueryTimeout);
prop.put("testOnBorrow", testOnBorrow);
prop.put("testOnReturn", testOnReturn);
prop.put("testWhileIdle", testWhileIdle);
prop.put("timeBetweenEvictionRunsMillis", timeBetweenEvictionRunsMillis);
prop.put("minEvictableIdleTimeMillis", minEvictableIdleTimeMillis);
prop.put("timeBetweenConnectErrorMillis", timeBetweenConnectErrorMillis);
prop.put("maxEvictableIdleTimeMillis", maxEvictableIdleTimeMillis);
prop.put("sharePreparedStatements", sharePreparedStatements);
prop.put("useGlobalDataSourceStat", useGlobalDataSourceStat);
prop.put("failFast", failFast);
//创建数据源
DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
dataSource.setProxyFilters(defaultDataSource.getProxyFilters());
dataSource.setName(dataSourceConfig.getDataSourceKey());
dataSource.setUrl(dataSourceConfig.getUrl());
dataSource.setUsername(dataSourceConfig.getUserName());
dataSource.setPassword(dataSourceConfig.getPassWord());
dataSource.setDriverClassName(dataSourceConfig.getDriver());
//注入bean对象
SpringHelper.registerSingletonBean(dataSourceKey, dataSource);
myDataSource.add(dataSourceKey);
log.info("数据源创建成功:【key:{}】", dataSourceKey);
}
/**
* 获取数据库连接对象
*/
public Connection getDataSourceConnection(String dataSourceKey) {
Connection connection = null;
if (!myDataSource.contains(dataSourceKey)) {
log.warn("当前数据源不存在,请创建数据源");
return connection;
}
try {
DruidDataSource dataSource = SpringHelper.getBean(dataSourceKey);
connection = dataSource.getConnection();
} catch (SQLException e) {
log.error("获取数据库连接失败", e.getMessage());
}
return connection;
}
/**
* 获取数据库连接对象
*/
public JdbcTemplate getJdbcTemplate(String dataSourceKey) {
JdbcTemplate jdbcTemplate = null;
if (!myDataSource.contains(dataSourceKey)) {
log.warn("当前数据源不存在,请创建数据源");
return null;
}
DataSource dataSource = SpringHelper.getBean(dataSourceKey);
jdbcTemplate = new JdbcTemplate(dataSource);
return jdbcTemplate;
}
}
Original: https://www.cnblogs.com/Sora-L/p/16750291.html
Author: 雨梦大木
Title: druid数据源手动创建
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620071/
转载文章受原作者版权保护。转载请注明原作者出处!