`

基于阿里DruidDataSource的多数据源管理

    博客分类:
  • Java
阅读更多
  • 数据源配置信息存储在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
1
分享到:
评论

相关推荐

    基于Spring的多数据源(Druid)定时任务

    本项目“基于Spring的多数据源(Druid)定时任务”专注于如何利用Spring框架和Druid数据源实现复杂的数据处理策略,尤其是涉及到定时任务的场景。下面将详细介绍这个项目的相关知识点。 首先,Spring框架作为Java领域...

    druid监控多数据源1

    本篇文章将基于给定的博客链接,详细阐述如何在项目中配置并实现Druid对多个数据源的监控。 首先,我们需要理解Druid监控的基本原理。Druid内置了一个Web监控界面,可以通过HTTP请求访问,展示数据库连接池的状态...

    spring-boot集成mybtis+druid实现hive/mysql多数据源切换

    通过以上步骤,我们就可以在Spring Boot项目中实现基于MyBatis和Druid的MySQL与Hive多数据源切换,灵活地满足不同业务场景对数据源的需求。在实际开发过程中,还要注意测试和优化,确保数据源切换的稳定性和效率。

    Springboot整合Druid与Mybatis的多数据源切换

    3. **配置Druid数据源**:使用`DruidDataSource`类作为数据源,并在配置类中通过`@Bean`注解声明。别忘了为每个数据源设置不同的名字,如`primaryDataSource`和`secondaryDataSource`。 4. **创建数据源路由`...

    Spring Boot 自定义数据源DruidDataSource代码

    而 DruidDataSource 是阿里巴巴开源的数据库连接池实现,提供了高性能、多功能的数据库连接池解决方案。下面将详细介绍如何在 Spring Boot 项目中自定义 DruidDataSource 代码。 一、添加依赖 要使用 Druid...

    SpringBoot+mybatis+Druid 运行时动态多数据源

    在现代企业级应用开发中,数据源管理是一个关键部分,特别是在需要访问多个数据库的应用中。SpringBoot、MyBatis和Druid的组合提供了一个高效且灵活的解决方案,尤其是在实现运行时动态多数据源方面。本篇文章将深入...

    基于springboot+druid+fastjson多数据源分布式事务处理源码.zip

    通过分析上述技术点,我们可以了解到该源码项目旨在提供一个完整的、基于Spring Boot的多数据源分布式事务处理解决方案,结合Druid的强大数据库管理能力和Fastjson的高效JSON处理,为开发者提供了一个实用的参考示例...

    springboot配置多数据源,注解自由切换,完美运行

    以上就是基于Spring Boot、MyBatis、Druid的多数据源配置及注解切换的详细步骤。通过这样的配置,开发者可以根据业务需求自由地在不同数据源之间切换,提高了代码的可读性和可维护性。同时,Druid连接池提供了丰富的...

    springboot + mybatise+druid多源静态数据库访问

    3. 创建数据源Bean:使用DruidDataSource创建多个数据源Bean,并为其指定唯一的名称。 4. 配置MyBatis:在MyBatis的配置文件中,为每个数据源指定一个SqlSessionFactoryBean,并关联对应的Mapper扫描路径。 5. ...

    SpringBoot+MyBatis+Druid+PageHelper实现多数据源并分页.docx

    在本文中,我们将深入探讨如何使用Spring Boot、MyBatis、Druid和PageHelper来实现多数据源分页。Spring Boot作为一个快速开发框架,简化了Java应用的搭建和配置过程,而MyBatis则是一个轻量级的ORM(对象关系映射)...

    SpringBoot使用Druid数据源的配置方法

    Spring Boot 使用 Druid 数据源的配置方法可以帮助开发者快速搭建基于 Spring Boot 的项目,并且提供了高效的数据库连接池解决方案。本文详细介绍了 Spring Boot 使用 Druid 数据源的配置方法,希望能够帮助开发者...

    数据源切换

    在数据源切换的场景中,Druid可以作为中间层,管理多个数据库连接,并根据配置或编程方式实现动态数据源切换,确保业务在不同数据库间平滑过渡。 实现数据源切换的步骤通常包括以下几个方面: 1. **配置多数据源**...

    参照阿里druid整理druid-spring-boot-starter的demo

    这个"参照阿里druid个人整理druid-spring-boot-starter可运行demo"是基于Spring Boot 2.x版本的,包含了Druid的基本配置和使用。为了构建一个完整的Druid配置,你需要以下几个步骤: 1. **依赖添加**:在`pom.xml`...

    spring+mybatis 多个数据源调用示例

    在提供的配置文件片段中,我们可以看到一个名为`mysqlDataSource`的`Bean`,它是基于阿里巴巴的Druid数据源实现的。Druid是一个强大的、高效的数据库连接池,它提供了监控、扩展性以及更好的性能。 ```xml ...

    springboot-druid.zip

    总的来说,SpringBoot整合Druid涉及的主要知识点包括:SpringBoot的依赖管理和自动配置机制,Druid数据源的配置与使用,以及基于SpringBoot的测试类编写。通过这样的集成,我们可以充分利用Druid的强大功能,同时...

    springboot 配置DRUID数据源的方法实例分析

    SpringBoot 是一个基于 Java 的开源框架,提供了多种方式来配置数据源。Druid 是阿里巴巴开源的一个数据库连接池,提供了高性能、多功能的数据库连接池解决方案。本文将介绍 SpringBoot 配置 Druid 数据源的方法,...

    JDBC数据源连接池的配置和使用示例

    数据源连接池(DataSource或Connection Pool)是一种管理数据库连接的技术,它预先创建并维护一定数量的数据库连接,当应用需要时可以从池中获取连接,用完后归还,而不是每次操作都创建新的连接。这样可以避免频繁...

    druid-1.0.19

    druid-1.0.19.jar Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、... DruidDataSource 高效可管理的数据库连接池。

    springboot+mybatis+druid 多数据源+redis+websocket+swagger2

    - 实现多数据源需要配置多个 DataSource,并在代码中根据业务逻辑选择合适的数据源。 9. **自定义注解+AOP实现日志记录**: - 自定义注解可以用于标记特定的代码段,以便在 AOP(面向切面编程)中处理这些代码。 ...

    datasource.zip

    总结来说,"datasource.zip"中的代码实例演示了如何在SpringBoot应用中使用MyBatis和Druid实现多数据源的切换和管理。理解并掌握这些技术可以帮助开发者构建更灵活、可扩展的数据库驱动型应用。

Global site tag (gtag.js) - Google Analytics