- 数据源配置信息存储在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监听消息发生异常");
}
}
}
```
相关推荐
本项目“基于Spring的多数据源(Druid)定时任务”专注于如何利用Spring框架和Druid数据源实现复杂的数据处理策略,尤其是涉及到定时任务的场景。下面将详细介绍这个项目的相关知识点。 首先,Spring框架作为Java领域...
本篇文章将基于给定的博客链接,详细阐述如何在项目中配置并实现Druid对多个数据源的监控。 首先,我们需要理解Druid监控的基本原理。Druid内置了一个Web监控界面,可以通过HTTP请求访问,展示数据库连接池的状态...
通过以上步骤,我们就可以在Spring Boot项目中实现基于MyBatis和Druid的MySQL与Hive多数据源切换,灵活地满足不同业务场景对数据源的需求。在实际开发过程中,还要注意测试和优化,确保数据源切换的稳定性和效率。
3. **配置Druid数据源**:使用`DruidDataSource`类作为数据源,并在配置类中通过`@Bean`注解声明。别忘了为每个数据源设置不同的名字,如`primaryDataSource`和`secondaryDataSource`。 4. **创建数据源路由`...
而 DruidDataSource 是阿里巴巴开源的数据库连接池实现,提供了高性能、多功能的数据库连接池解决方案。下面将详细介绍如何在 Spring Boot 项目中自定义 DruidDataSource 代码。 一、添加依赖 要使用 Druid...
在现代企业级应用开发中,数据源管理是一个关键部分,特别是在需要访问多个数据库的应用中。SpringBoot、MyBatis和Druid的组合提供了一个高效且灵活的解决方案,尤其是在实现运行时动态多数据源方面。本篇文章将深入...
通过分析上述技术点,我们可以了解到该源码项目旨在提供一个完整的、基于Spring Boot的多数据源分布式事务处理解决方案,结合Druid的强大数据库管理能力和Fastjson的高效JSON处理,为开发者提供了一个实用的参考示例...
以上就是基于Spring Boot、MyBatis、Druid的多数据源配置及注解切换的详细步骤。通过这样的配置,开发者可以根据业务需求自由地在不同数据源之间切换,提高了代码的可读性和可维护性。同时,Druid连接池提供了丰富的...
3. 创建数据源Bean:使用DruidDataSource创建多个数据源Bean,并为其指定唯一的名称。 4. 配置MyBatis:在MyBatis的配置文件中,为每个数据源指定一个SqlSessionFactoryBean,并关联对应的Mapper扫描路径。 5. ...
在本文中,我们将深入探讨如何使用Spring Boot、MyBatis、Druid和PageHelper来实现多数据源分页。Spring Boot作为一个快速开发框架,简化了Java应用的搭建和配置过程,而MyBatis则是一个轻量级的ORM(对象关系映射)...
Spring Boot 使用 Druid 数据源的配置方法可以帮助开发者快速搭建基于 Spring Boot 的项目,并且提供了高效的数据库连接池解决方案。本文详细介绍了 Spring Boot 使用 Druid 数据源的配置方法,希望能够帮助开发者...
在数据源切换的场景中,Druid可以作为中间层,管理多个数据库连接,并根据配置或编程方式实现动态数据源切换,确保业务在不同数据库间平滑过渡。 实现数据源切换的步骤通常包括以下几个方面: 1. **配置多数据源**...
这个"参照阿里druid个人整理druid-spring-boot-starter可运行demo"是基于Spring Boot 2.x版本的,包含了Druid的基本配置和使用。为了构建一个完整的Druid配置,你需要以下几个步骤: 1. **依赖添加**:在`pom.xml`...
在提供的配置文件片段中,我们可以看到一个名为`mysqlDataSource`的`Bean`,它是基于阿里巴巴的Druid数据源实现的。Druid是一个强大的、高效的数据库连接池,它提供了监控、扩展性以及更好的性能。 ```xml ...
总的来说,SpringBoot整合Druid涉及的主要知识点包括:SpringBoot的依赖管理和自动配置机制,Druid数据源的配置与使用,以及基于SpringBoot的测试类编写。通过这样的集成,我们可以充分利用Druid的强大功能,同时...
SpringBoot 是一个基于 Java 的开源框架,提供了多种方式来配置数据源。Druid 是阿里巴巴开源的一个数据库连接池,提供了高性能、多功能的数据库连接池解决方案。本文将介绍 SpringBoot 配置 Druid 数据源的方法,...
数据源连接池(DataSource或Connection Pool)是一种管理数据库连接的技术,它预先创建并维护一定数量的数据库连接,当应用需要时可以从池中获取连接,用完后归还,而不是每次操作都创建新的连接。这样可以避免频繁...
druid-1.0.19.jar Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、... DruidDataSource 高效可管理的数据库连接池。
- 实现多数据源需要配置多个 DataSource,并在代码中根据业务逻辑选择合适的数据源。 9. **自定义注解+AOP实现日志记录**: - 自定义注解可以用于标记特定的代码段,以便在 AOP(面向切面编程)中处理这些代码。 ...
总结来说,"datasource.zip"中的代码实例演示了如何在SpringBoot应用中使用MyBatis和Druid实现多数据源的切换和管理。理解并掌握这些技术可以帮助开发者构建更灵活、可扩展的数据库驱动型应用。