SpringBoot 动态配置数据源-进阶-可视化动态配置数据源-1

固定配置多数据源:https://www.cnblogs.com/feecy/protected/p/11847207.html

springboot-yml 配置编辑

节点配置:    

slave:
  datasource:
    names: N1,N2
    N1:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://XXXXXXXXXXX1
      username: root
      password:
      type: com.alibaba.druid.pool.DruidDataSource
    N2:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://XXXXXXXXXXX2
      username: root
      password:
      type: com.alibaba.druid.pool.DruidDataSource 

yaml-jar包:

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.25</version>
</dependency>

获取Yaml对象

    private Yaml getYamlObject(){
        DumperOptions dumperOptions = new DumperOptions();
        dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
        dumperOptions.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN);
        dumperOptions.setPrettyFlow(false);
        Yaml yaml = new Yaml(dumperOptions);
        return  yaml;
    }

配置一个新的节点

//DatabaseConfig{url,username,password}

private Map<String, String> getNodeMap(DatabaseConfig config) {
        Map<String,String> node = new LinkedHashMap<>();
        node.put("driver-class-name","com.mysql.jdbc.Driver");
        node.put("url",config.getUrl());
        node.put("username",config.getUsername());
        node.put("password",config.getPassword());
        node.put("type","com.alibaba.druid.pool.DruidDataSource");        return node;
    }
获取配置文件对象(我的配置文件在jar同级config/ 下面)

yaml-load加载成Map ,获取并编辑后,yaml-dump 重新写回到文件

public void add(DatabaseConfig config){     //获取配置文件对象(我的配置文件在jar包同级目录/config/ 下面)     log.info("user.dir:{}",System.getProperty("user.dir"));     File dumpFile = new File(System.getProperty("user.dir")+"/config/application.yml");      JSONObject result = new JSONObject();     Yaml yaml = getYamlObject();     Map map = null;
    try {        map = (Map)yaml.load(new FileInputStream(dumpFile));    } catch (FileNotFoundException e) {        log.error("{}",e);    }    Map datasource = (Map) ((Map) map.get("slave")).get("datasource");    String[] names = ((String)datasource.get("names")).split(",");    if(StringUtil.contains(names,config.getName())){        //名称已经存在        return;    }  //追加names    if(names.length>0){        datasource.put("names",(String)datasource.get("names")+","+config.getName());    }else{        datasource.put("names", config.getName());    }  //获取新的Node    Map<String, String> node = getNodeMap(config);    datasource.put(config.getName(),node);    try {    //写回到配置文件        yaml.dump(map, new OutputStreamWriter(new FileOutputStream(dumpFile)));    } catch (FileNotFoundException e) {        log.error("{}",e);    }    //添加成功    return;}

编辑节点,删除节点同添加  操作Map对象后写回到Yml文件。

未完待续....

  

原文地址:https://www.cnblogs.com/feecy/p/12108350.html

时间: 2024-11-01 18:31:00

SpringBoot 动态配置数据源-进阶-可视化动态配置数据源-1的相关文章

SpringBoot 动态配置数据源-进阶-可视化动态配置数据源-2

接 SpringBoot 动态配置数据源-进阶-可视化动态配置数据源-1 配置文件修改后,需要使配置生效 采用springcloud 配置 jar :  spring-cloud-starter-config + spring-boot-starter-actuator <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuat

搞定SpringBoot多数据源(2):动态数据源

目录 1. 引言 2. 动态数据源流程说明 3. 实现动态数据源 3.1 说明及数据源配置 3.1.1 包结构说明 3.1.2 数据库连接信息配置 3.1.3 数据源配置 3.2 动态数据源设置 3.2.1 动态数据源配置 3.2.2 动态选择数据源 3.2.3 动态数据源使用 3.3 使用 AOP 选择数据源 3.3.1 定义数据源注解 3.3.2 定义数据源切面 3.3.3 使用 AOP 进行数据源切换 4. 再思考一下 5. 总结 参考资料 往期文章 一句话概括:使用动态数据源对多个数据库

动态路由协议RIP的基本原理与配置

  前面学习了静态路由的原理,但是用静态路由搭建网络时,每一条路由的变更都需要手动进行配置,这在大型网络中的工作量是非常巨大的.有没有办法解决呢?答案是肯定的,使用动态路由即可解决此问题 动态路由协议基础 1. 动态路由概述 动态路由是网络中路由器之间互相通信,传递路由信息,利用收到的路由信息更新路由表的过程.它能实时的适应网络结构的变化.如果路由更新信息表明网络发生了变化,路由选择软件就会重新计算路由,并发出新的路由更新信息.这些信息通过各个网络,引起各路由器重新启动其路由算法,并更新各自的路

tomato路由器上配置花生壳DDNS动态域名

Google最近被封的很彻底,之前在Google SVN服务器上托管的代码不好访问了. 算是废物利用吧, 我把老笔记本跑的慢死的Win8卸了,装了Ubuntu,架了SVN服务器,把一些个人代码都放在上面管理.在家里和公司进行提交同步. 上海电信的网络是有公网IP的,我N年前还在山东淄博的时候注册的花生壳DDNS帐号竟然还能用,当时免费的4个二级域名也是OK的.于是就用花生壳搞定DDNS,用域名来访问SVN服务. 在工作笔记本上跑花生壳客户端还是麻烦,这个笔记本又不能一直开着,所以访问起来就有一些

配置静态路由和动态路由详解

配置路由信息的两种方式简单介绍: 因为路由器的默认路由表只有直连的路由信息,所以需要配置不是直连的路由信息. 配置路由,不明思义就是告诉路由器不知道的路由. 如图设置路由,目的为使R1能ping通R3,R3能ping通R1. 静态路由配置:ip address 目标网段号 子网掩码 下一跳ip R1: en conf t Ip address  192.168.2.0  255.255.255.0  192.168.1.2 R3: en conf t Ip address  192.168.1.

ES 12 - 配置使用Elasticsearch的动态映射(dynamic mapping)

目录 1 动态映射(dynamic mapping) 1.1 什么是动态映射 1.2 体验动态映射 1.3 搜索结果不一致的原因分析 2 开启dynamic mapping策略 2.1 约束策略 2.2 策略示例 3 定制dynamic mapping策略 3.1 date_detection - 日期识别策略 3.2 在type中自定义动态映射模板 3.3 [过期]在index中自定义默认映射模板 1 动态映射(dynamic mapping) 1.1 什么是动态映射 动态映射时Elastic

Spring实现动态数据源,支持动态加入、删除和设置权重及读写分离

当项目慢慢变大,訪问量也慢慢变大的时候.就难免的要使用多个数据源和设置读写分离了. 在开题之前先说明下,由于项目多是使用Spring,因此下面说到某些操作可能会依赖于Spring. 在我经历过的项目中,见过比較多的读写分离处理方式,主要分为两步: 1.对于开发者,要求serivce类的方法名必须遵守规范,读操作以query.get等开头,写操作以update.delete开头. 2.配置一个拦截器,根据方法名推断是读操作还是写操作,设置对应的数据源. 以上做法能实现最简单的读写分离.但对应的也会

Spring实现动态数据源,支持动态添加、删除和设置权重及读写分离

当项目慢慢变大,访问量也慢慢变大的时候,就难免的要使用多个数据源和设置读写分离了. 在开题之前先说明下,因为项目多是使用Spring,因此以下说到某些操作可能会依赖于Spring. 在我经历过的项目中,见过比较多的读写分离处理方式,主要分为两步: 1.对于开发人员,要求serivce类的方法名必须遵守规范,读操作以query.get等开头,写操作以update.delete开头. 2.配置一个拦截器,依据方法名判断是读操作还是写操作,设置相应的数据源. 以上做法能实现最简单的读写分离,但相应的也

SpringBoot学习笔记(1):配置Mybatis

SpringBoot学习笔记(1):配置Mybatis 参考资料: 1.AndyLizh的博客 2.xiaolyuh123的博客 快速开始 添加Mybatis依赖(其他依赖已省去) <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId