Spring动态添加数据源(全自动)

这篇具有很好参考价值的文章主要介绍了Spring动态添加数据源(全自动)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、使用场景

1、现在网上所有写的动态数据源,都是假动态数据,都是预先知道要连接几个数据库,但这不满足具体真正需要动态添加连接数据库的需求;

2、在很多业务场景下,如项目默认连一个主数据库,服务启动后,因业务不停的变更,需要动态连接其它数据库处理数据,关键点是其它数据库,在服务启动前是不知道连接地址的,所以其它数据库的地址是无法预先配置在application.yml文件中

二、因项目需求,需要真正动态连接其它库处理数据

1、做之前,百度网上搜,都是假动态数据源,为实现上面的真正动态添加数据,也花了几天时间才集成起,废话不多说

三、准备工作

1、准备三个数据,db_main,db_add01,db_add02,其中db_main为项目起动,默认连的主数据库,为了下面测试方便,我在三个数据库中创建了不同的三张表sys_company、sys_role、sys_user,以表示查询的数据不同,数据来源于不同的数据库,截图如下

Spring动态添加数据源(全自动)

application.yml中配置主数据库接信息

server:
  port: 8085
spring:
  application:
    name: mydata
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://192.168.137.202:3306/db_main?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
    druid:
      initialSize: 5
      minIdle: 5
      maxActive: 20
      maxWait: 60000
      #配置监控属性: 在druid-starter的: com.alibaba.druid.spring.boot.autoconfigure.stat包下进行的逻辑配置
      # WebStatFilter配置,
      stat-view-servlet:
        #配置DruidStatViewServlet的访问地址。后台监控页面的访问地址
        url-pattern: /druid/*
        #禁用HTML页面上的“重置”功能,会把所有监控的数据全部清空,一般不使用
        reset-enable: false
        #监控页面登录的用户名
        login-username: admin
        #监控页面登录的密码
        login-password: 123456
        #白名单
        allow:
        #黑名单
        deny:

 2、动态添加数据库核心代码

/**
     * 添加私有数据源
     * @param dbName 数据库名
     * @param url
     * @param username
     * @param password
     */
    public void addDataSource(String dbName,String url,String username,String password){
        if(!StringUtils.isEmpty(dbName)) {
            if (dataSourcesMap.get(dbName) == null) {
                DataSource dataSource = druidDataSource(url, username, password);
                dataSourcesMap.put(dbName, dataSource);
                super.setTargetDataSources(dataSourcesMap);
                super.afterPropertiesSet();
            } else {
                DruidDataSource dataSource = (DruidDataSource) dataSourcesMap.get(dbName);
                if (!dataSource.isEnable()) {
                    try {
                        dataSource.restart();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    /**
     * 移出对应数据源
     * @param dbName
     */
    public void removeDataSource(String dbName){
        if(dataSourcesMap.get(dbName)!=null) {
            DruidDataSource dataSource= (DruidDataSource)dataSourcesMap.get(dbName);
            dataSourcesMap.remove(dbName);
            dataSource.close();
            super.afterPropertiesSet();
        }
    }

3、动态切换数据库

//线程本地环境
    private static final ThreadLocal<String> dataSources = new ThreadLocal<String>();
    //设置数据源,动态切换,就是调用这个setDataSource方法
    public static void setDataSource(String customerType) {
        dataSources.set(customerType);
    }
    //获取数据源
    public static String getDataSource() {
        return (String) dataSources.get();
    }
    //清除数据源
    public static void clearDataSource() {
        dataSources.remove();
    }

4、controller接口测试,代码如下

/**
     * 查询主库数据
     */
    @GetMapping (value="/findMain")
    public SysCompany findMain(@RequestParam(defaultValue = "C190829X5R")String id) {
        DataSourceHolder.setDataSource("db_main");
        SysCompany company = (SysCompany)dataService.findTById(SysCompany.class,id);
        return company;
    }

    /**
     * 查询db_add01号库数据
     * dbName 对应数据库名称
     */
    @GetMapping (value="/addDB")
    public String addDB(@RequestParam(defaultValue = "db_add01") String dbName, @RequestParam(defaultValue = "jdbc:mysql://192.168.137.202:3306/db_add01") String url,
                        @RequestParam(defaultValue = "root")String username, @RequestParam(defaultValue = "123456")String password) {
        dynamicDataSource.addDataSource(dbName,url,username,password);
        return "添加成功";
    }

    /**
     *
     * 查询db_add01号库数据
     * dbName 对应数据库名称
     */
    @GetMapping (value="/findDb01")
    public SysUser findDb01(@RequestParam(defaultValue = "db_add01")String dbName,@RequestParam(defaultValue = "5")String id) {
        DataSourceHolder.setDataSource(dbName);
        SysUser sysUser = (SysUser)dataService.findTById(SysUser.class,id);
        return sysUser;
    }

    /**
     * 查询db_add02号库数据
     * dbName 对应数据库名称
     */
    @GetMapping (value="/findDb02")
    public SysRole findDb02(@RequestParam(defaultValue = "db_add02")String dbName,@RequestParam(defaultValue = "1")String id) {
        DataSourceHolder.setDataSource(dbName);
        SysRole sysRole = (SysRole)dataService.findTById(SysRole.class,id);
        return sysRole;
    }

四、测试

1、查询主库数据,GET请求 http://localhost:8085/app/findMain?id=C190829X5R

Spring动态添加数据源(全自动)

 2、为了演示效果,我们在不添加db_add01库之前,查询一下db_add01库中的表sys_user,是要报错的 http://localhost:8085/app/findDb01?dbName=db_add01&id=5

Spring动态添加数据源(全自动)

 3、添加db_add01号库,后查询数据

添加库:http://localhost:8085/app/addDB?dbName=db_add02&url=jdbc:mysql://192.168.137.202:3306/db_add02&username=root&password=123456

Spring动态添加数据源(全自动)

上面db_add01添加之后,查询db_add01,数据可以顺利查询出来: 

http://localhost:8085/app/findDb01?dbName=db_add01&id=5

Spring动态添加数据源(全自动)

 五、总结

1、在db_add01添加之前,查询db_add01库中的表sys_user,服务报错,找不到对应的表

2、在通过接口添加db_add01数据库之后,可以正常查询出数据

3、如需要源代码,可下载 百度网盘 请输入提取码文章来源地址https://www.toymoban.com/news/detail-428619.html

到了这里,关于Spring动态添加数据源(全自动)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一种实现Spring动态数据源切换的方法

    不在现有查询代码逻辑上做任何改动,实现dao维度的数据源切换(即表维度) 节约bdp的集群资源。接入新的宽表时,通常uat验证后就会停止集群释放资源,在对应的查询服务器uat环境时需要查询的是生产库的表数据(uat库表因为bdp实时任务停止,没有数据落入),只进行服务

    2024年02月09日
    浏览(48)
  • 一种实现Spring动态数据源切换的方法 | 京东云技术团队

    不在现有查询代码逻辑上做任何改动,实现dao维度的数据源切换(即表维度) 节约bdp的集群资源。接入新的宽表时,通常uat验证后就会停止集群释放资源,在对应的查询服务器uat环境时需要查询的是生产库的表数据(uat库表因为bdp实时任务停止,没有数据落入),只进行服务

    2024年02月10日
    浏览(51)
  • spring多数据源动态切换的实现原理及读写分离的应用

    AbstractRoutingDataSource 是Spring框架中的一个抽象类,可以实现多数据源的动态切换和路由,以满足复杂的业务需求和提高系统的性能、可扩展性、灵活性。 多租户支持:对于多租户的应用,根据当前租户来选择其对应的数据源,实现租户级别的隔离和数据存储。 分库分表:为了

    2024年02月14日
    浏览(34)
  • 如何在Spring Boot应用中使用Nacos实现动态更新数据源

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月10日
    浏览(34)
  • 【Spring AOP + 自定义注解 + 动态数据源 实现主从库切换&读写分离】—— 案例实战

                                                 💧 S p r i n g A O P + 主从数据源切换 + 读写分离 + 自定义注解案例实战! color{#FF1493}{Spring AOP + 主从数据源切换 + 读写分离 + 自定义注解 案例实战!} Sp r in g A OP + 主从数据源切换 + 读写分离 + 自定义注解案例

    2024年02月15日
    浏览(31)
  • Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换

    MySQL 主从复制是一种常见的数据库架构,它可以提高数据库的性能和可用性。 动态数据源切换则可以根据业务需求,在不同场景下使用不同的数据源,比如在读多写少的场景下,可以通过切换到从库来分担主库的压力 。 在本文中,我们将介绍如何在 Spring Boot 中实现 MySQL 动

    2024年02月19日
    浏览(46)
  • 使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库

    记录 :415 场景 :使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库。 版本 :JDK 1.8,Spring Boot 2.6.3,dynamic-datasource-spring-boot-starter-3.3.2,mybatis-3.5.9。 源码 :https://github.com/baomidou/dynamic-datasource-spring-boot-starter dynamic-datasource-spring-boot-starter :一个基于springboot的快

    2023年04月19日
    浏览(38)
  • 分享一个优秀的动态数据源开源库-dynamic-datasource-spring-boot-starter

    在我们的Java后端研发工作中, 有时候由于业务的快速迭代和数据的安全隔离性,往往会为不同的 API业务线分配不同的数据库,即一个微服务经常需要和多个数据源打交道。 dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。 其支持 Jdk 1.7+, Spring

    2024年02月12日
    浏览(52)
  • 使用dynamic-datasource-spring-boot-starter动态切换数据源操作数据库(MyBatis-3.5.9)

    记录 :383 场景 :使用dynamic-datasource-spring-boot-starter动态切换数据源,使用MyBatis操作数据库。提供三种示例:一,使用@DS注解作用到类上。二,使用@DS注解作用到方法上。三,不使用注解,使用DynamicDataSourceContextHolder类在方法内灵活切换不同数据源。 源码: https://github.com/

    2024年01月20日
    浏览(48)
  • MyBatis Plus 插件 动态数据源实现原理与源码讲解 (dynamic-datasource-spring-boot-starter-master)

    目录 1. 介绍 2. 基本原理 3. 源码介绍 3.1 使用 AOP 拦截,方法执行前获取到当前方法要用的数据源 3.2 实现自定义 DataSource 接口,实现 DataSource 接口的 getConnect 方法做动态处理 多数据源即一个项目中同时存在多个不同的数据库连接池。 比如 127.0.0.1:3306/test   127.0.0.1:3307/test 

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包