- 数据源配置信息存储在T_M_ORGANIZATION表中。
DB_TYPE | ‘数据库类型’ |
DB_DRIVER_CLASS ‘ | 数据库连接驱动’ |
DB_URL | ‘数据库连接地址’ |
DB_USERNAME | ‘数据库用户名’ |
DB_PASSWORD | ‘数据库连接密码’ |
DB_URL_BAK | ‘数据库备用地址’ |
DB_URL_TYPE | ‘数据源连接地址:1:主地址 2:备用地址’ |
HAS_CREATE_DATASOURCE | ‘是否创建过数据源 0:否 1:是’ |
------------
1.重写dubbo的spring容器启动方法
需要工程的资源目录下重新定义Spring容器加载类 com.alibaba.dubbo.container.Container 文件名不能修改
文本内容:`xfServer=com.st.tks.utils.spring.SpringContainer`
SpringContainer
```java
public class SpringContainer implements Container {
private static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SpringContainer.class.getName());
public static final String SPRING_CONFIG = "dubbo.spring.config";
public static final String DEFAULT_SPRING_CONFIG = "classpath*:META-INF/spring/*.xml";
static ClassPathXmlApplicationContext context;
public SpringContainer() {
}
public static ClassPathXmlApplicationContext getContext() {
return context;
}
public void start() {
logger.info("开始启动Spring容器............................................");
String configPath = ConfigUtils.getProperty("dubbo.spring.config");
if (configPath == null || configPath.length() == 0) {
configPath = "classpath*:META-INF/spring/*.xml";
}
context = new ClassPathXmlApplicationContext(configPath.split("[,\\s]+"));
OrganizationService organizationService = (OrganizationService) context.getBean("organizationService");
OrganizationDTO dto = new OrganizationDTO();
List<OrganizationDTO> list = organizationService.selectOrganizationList(dto);
DruidDataSource baseDateSource = (DruidDataSource) context.getBean("dataSourceBase");//从加载器中获取基础数据源配置类
DynamicDataSource dataSource = (DynamicDataSource) context.getBean("dataSource");//自定义数据源配置信息类,替代XML文件中反复定义多数据源信息
if (null != list) {
for (OrganizationDTO org : list) {
if (org.getHasCreateDatasource() == 1) {//过滤掉未创建数据源的机构
DruidDataSource druidDataSource = null;
try {
//复制基础数据源中基本配置信息,如:initialSize、minIdle、maxActive
druidDataSource = (DruidDataSource) baseDateSource.clone();
druidDataSource.setUsername(org.getDbUsername());//设置数据库用户名
druidDataSource.setPassword(org.getDbPassword());//设置数据库密码
druidDataSource.setUrl(org.getDbUrlType() == 1 ? org.getDbUrl() : org.getDbUrlBak());//使用备用还是主用地址
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
dataSource.addTargetDataSources(org.getOrgSed(), druidDataSource);
}
}
}
context.start();
}
public void stop() {
try {
if (context != null) {
logger.info("销毁Spring容器............................................");
context.stop();
context.close();
context = null;
}
} catch (Throwable var2) {
logger.error(var2.getMessage(), var2);
}
}
}
```
DynamicDataSource
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
private static org.slf4j.Logger logger = LoggerFactory.getLogger(DynamicDataSource.class.getName());
private static Map<Object, Object> targetDataSources;
static {
targetDataSources = new LinkedHashMap<>();
}
@Override
protected Object determineCurrentLookupKey() {
return HandleDataSource.getDataSource();
}
@Override
public void setDataSourceLookup(DataSourceLookup dataSourceLookup) {
super.setDataSourceLookup(dataSourceLookup);
}
@Override
public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
super.setDefaultTargetDataSource(defaultTargetDataSource);
}
@Override
public void setTargetDataSources(Map targetDataSources) {
super.setTargetDataSources(targetDataSources);
//重点
super.afterPropertiesSet();
}
public void addTargetDataSources(String orgSeq, Object dataSource) {
if (StringUtils.hasText(orgSeq)
&& null != dataSource) {
logger.info("----------------新增" + orgSeq + "数据连接---------------------:" + orgSeq);
if (targetDataSources.containsKey(orgSeq)) {
DruidDataSource db = (DruidDataSource) targetDataSources.get(orgSeq);
logger.info(orgSeq + " 关闭前的连接数:" + db.getActiveCount() + "--" + db.getConnectCount());
db.close();//安全关闭数据库连接
logger.info(orgSeq + " 关闭后的连接数:" + db.getActiveCount() + "--" + db.getConnectCount());
}
targetDataSources.put(orgSeq, dataSource);
setTargetDataSources(targetDataSources);
}
}
}
```
页面点击刷新数据源动作是,JMS topic分发到各个子业务系统;子业务系统JMS Listener 到刷新动作,刷新数据源信息;
```java
@Override
public void onMessage(Message message) {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
try {
try {
ClassPathXmlApplicationContext context = SpringContainer.getContext();
OrganizationDTO dto = organizationService.selectOrganizationOne(textMessage.getText());
DruidDataSource baseDateSource = (DruidDataSource) context.getBean("dataSourceBase");
DynamicDataSource dataSource = (DynamicDataSource) context.getBean("dataSource");
logger.info("dataSourceTopic监听刷新数据源" + dto.getOrgSed() + " 线程名:"+Thread.currentThread().getName());
if (null != dto) {
DruidDataSource druidDataSource = null;
try {
druidDataSource = (DruidDataSource) baseDateSource.clone();
druidDataSource.setUsername(dto.getDbUsername());
druidDataSource.setPassword(dto.getDbPassword());
druidDataSource.setUrl(dto.getDbUrlType() == 1 ? dto.getDbUrl() : dto.getDbUrlBak());
dataSource.addTargetDataSources(dto.getOrgSed(), druidDataSource);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
logger.info("jsm监听消息发生异常");
}
} catch (Exception e) {
e.printStackTrace();
logger.info("jsm监听消息发生异常");
}
}
}
```
相关推荐
项目背景: 1. Springboot项目 ... 一个主数据源,数据名称库不变。 3. 一个副数据源,数据库名称每天都在变,比如今天1号,是db_01; 明天2号,是db_02。 4.不重启项目切换数据源。 5.项目介绍: ...
可以帮助你了解,以及配置实现DruidDataSource数据源的配置
spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制
基于Spring的多数据源(Druid)定时任务项目开发
Spring Boot+Jpa多数据源配置Demo,可同时支持多种数据库,不同数据库,同时支持不同数据库的JdbcTemplate
SpringBoot +Maven +Druid 多数据源(Mysql+SqlServer)动态切换数据源
JDBC DruidDataSource dataSource = new DruidDataSource();
自己临时搭建的SpringBoot多数据源连接报表,同时连接Mysql,Oracle数据库Mybatis连接,Druid监控双数据源,Quart执行定时任务,PageHelper分页,前端延用Layui
spring boot 整合mybtis druid 多数据源 源代码。
基于SpringBoot框架,结合druid数据库连接池,实现多数据源自动切换的一个示例
spring boot 整合mybtis druid 多数据源 源代码。
本文档实现了springboot+mysql+mybatis+druid实现多数据源配置的基本实现,该文档仅做参考,基于不同的版本依赖有所不同,具体看官方的文档
阿里巴巴的数据源管理工具jar包,可提高访问数据库的性能
多数据源配置,使用了数据库连接池,并且是多数据源,分也不要多了,2分,有什么疑问可以指出,或者不足也可以一起学习
Spring Boot整合Mybatis使用druid实现多数据源自动切换
SpringBoot整合JDBC&Druid;数据源示例,整合看一下监控页面,拿来即用,省时省力,增加了自定义配置,注册自己的配置参数。
本篇文章主要讲述的是SpringBoot整合Mybatis、Druid和PageHelper 并实现多数据源和分页,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
将 client-adapter.es7x-1.1.5-jar-with-dependencies.jar 替换plugin下的jar可以解决druid报错问题,注意版本1.1.5,不是这个版本不一定能解决
基于springboot和maven、druid整合的多数据源项目,可以直接在企业开发中使用的动态数据源,可以用于单体项目或者微服务使用,支持mysql,pgsql,oracle等
springboot开发,使用阿里druid-spring-boot-starter包,配置的多数据源demo,可自由加入多个数据源