由于目前项目中需要用到项目中的两个库,研究了一下发现一个比较轻松的写法。
首先配置多个数据源并且交给bean管理 写在 Config中
@Bean(name = "db1")
public DataSource druidDataSource() {
DruidDataSource datasource = null;
//直连数据库
if ("0".equals(jndiflag)) {
datasource = new DruidDataSource();
datasource.setUrl(dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
log.error("druid configuration initialization filter", e);
}
} else {
try {
Context ctx = new InitialContext();
datasource = (DruidDataSource) ctx.lookup("");
} catch (NamingException e) {
log.error("通过JNDI名称找到DataSource 异常", e);
}
}
return datasource;
}
@Bean(name = "db2")
public DataSource druidDataSourceTwo() {
DruidDataSource datasource = null;
//直连数据库
if ("0".equals(jndiflag)) {
datasource = new DruidDataSource();
datasource.setUrl(dbUrlTwo);
datasource.setUsername(usernameTwo);
datasource.setPassword(passwordTwo);
datasource.setDriverClassName(driverClassNameTwo);
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
log.error("druid configuration initialization filter", e);
}
} else {
try {
Context ctx = new InitialContext();
datasource = (DruidDataSource) ctx.lookup("");
} catch (NamingException e) {
log.error("通过JNDI名称找到DataSource 异常", e);
}
}
return datasource;
}
目前配置了两个数据源后,我们也应该在Config 中指定一个默认数据源
@Bean(name = "dynamicDataSource")
@Primary
public DataSource dynamicDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
// 默认数据源
dynamicDataSource.setDefaultTargetDataSource(db1);
// 配置多数据源
Map<Object, Object> dsMap = new HashMap<>();
dsMap.put("db1", db1);
dsMap.put("db2", db2);
dynamicDataSource.setTargetDataSources(dsMap);
return dynamicDataSource;
}
以下是DynamicDataSource 类
package com.guobaojingrong.salesupport.config;/*
* 消息描述
* @Description: $
* @return: $
* @Author: 李
* @Date: $ $
*/
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
@Slf4j
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
log.info("动态获取数据源——{}",DataSourceUtil.getDB());
return DataSourceUtil.getDB();
}
}
DataSourceUtil类
package com.guobaojingrong.salesupport.config;/*
* 消息描述
* @Description: $
* @return: $
* @Author: 李
* @Date: $ $
*/
public class DataSourceUtil {
private static final ThreadLocal<String> contextHolder = new ThreadLocal();
/**
* 设置数据源名
* @param dbType
*/
public static void setDB(String dbType) {
contextHolder.set(dbType);
}
/**
* 获取数据源名
* @return
*/
public static String getDB() {
return contextHolder.get();
}
/**
* 清除数据源名
*/
public static void clearDB() {
contextHolder.remove();
}
}
在Controller 指定对应的库