项目启动时,动态 、循环将所有的数据源加入DynamicRoutingDataSource中
# 数据源
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
# mybatis配置
mybatis:
mapper-locations: classpath:mapper/*.xml # mapper映射文件位置
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #用于控制台打印sql语句
logging:
level:
org.springframework.web: debug
cn.zifangsky: debug
file:
name: web-exercise.log
path: logs
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.x.program.service.XjnService;
import com.x.program.util.InitDBUTil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Xjn
* @create 2023-02-20 17:09
*
*/
@Component
public class DynamicDatasourceConfig {
private Logger logger = LoggerFactory.getLogger(DynamicDatasourceConfig.class);
private Map<String,String> hospitalTable = new HashMap();
@Resource
private XService xService;
@Resource
private DynamicRoutingDataSource dataSource;
/**
* 初始化加载所有的医院
*/
@PostConstruct
public void loadAllDB(){
hospitalTable.put("master","管理中心");
//查询所有已经建库的医院
List<Map<Object, String>> AllDB =xService.findAllDB();
for (Map map : AllDB) {
DruidDataSource tmpdb = InitDBUTil.getInitDBConfig();
tmpdb.setUsername(map.get("username").toString());
tmpdb.setPassword(map.get("password").toString());
tmpdb.setUrl("jdbc:mysql://"+map.get("mysqlSchema")+"/"+map.get("mysqlurl")+"?useUnicode=true&characterEncoding=utf-8");
tmpdb.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.addDataSource(map.get("mysqlurl").toString(),tmpdb);
logger.info("====加载动态数据库完成,mysqlSchema="+map.get("mysqlSchema").toString());
hospitalTable.put(map.get("mysqlSchema").toString(),map.get("hosplitalName").toString());
}
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
logger.info("==已连接的数据源=="+ds.getDataSources().keySet());
}
}
public class InitDBUTil {
public static DruidDataSource getInitDBConfig(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setInitialSize(5);
dataSource.setMaxActive(20);
dataSource.setMinIdle(5);
dataSource.setMaxWait(6000);
dataSource.setTimeBetweenEvictionRunsMillis(60000);
dataSource.setMinEvictableIdleTimeMillis(300000);
dataSource.setValidationQuery("select 1 from dual");
dataSource.setTestWhileIdle(true);
dataSource.setTestOnBorrow(false);
dataSource.setTestOnReturn(false);
dataSource.setPoolPreparedStatements(true);
dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
return dataSource;
}
}
@Service
public class XServiceImpl implements XService {
@Autowired
XMapper xMapper;
@Override
@DS("#header.tenantName")//从header获取需要查询库名
public List<Map> findMessage() {
return xMapper.findMessage();
}
@Override
public List<Map<Object, String>> findAllDB() {
return xMapper.findAllDB();
}
}