DynamicRoutingDataSource dynamic-datasource 多数据源动态加载、切换
项目启动时,动态 、循环将所有的数据源加入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();
}
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgcafic
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01