美文网首页springcloudspringbootjs css html
SpringBoot中利用nacos等配置中心对数据源进行动态刷

SpringBoot中利用nacos等配置中心对数据源进行动态刷

作者: 梅西爱骑车 | 来源:发表于2023-02-10 07:41 被阅读0次

    怎么在SpringBoot中利用nacos(其他配置中心同)对数据源进行动态刷新?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

    第一步:重写DruidAbstractDataSource类

    这里为什么要重写这个类:因为DruidDataSource数据源在初始化后,就不允许再重新设置数据库的url和userName

    public void setUrl(String jdbcUrl) {
        if (StringUtils.equals(this.jdbcUrl, jdbcUrl)) {
          return;
        }
        // 重写的时候,需要将这个判断注释掉,否则会报错
        // if (inited) {
        //   throw new UnsupportedOperationException();
        // }
    
        if (jdbcUrl != null) {
          jdbcUrl = jdbcUrl.trim();
        }
    
        this.jdbcUrl = jdbcUrl;
    
        // if (jdbcUrl.startsWith(ConfigFilter.URL_PREFIX)) {
        // this.filters.add(new ConfigFilter());
        // }
      }
    
      public void setUsername(String username) {
        if (StringUtils.equals(this.username, username)) {
          return;
        }
            // 重写的时候,需要将这个判断注释掉,否则会报错
        // if (inited) {
        //   throw new UnsupportedOperationException();
        // }
    
        this.username = username;
      }
    

    重写的时候包路径不能变,只有这样类加载的时候才会优先加载重写后的类

    怎么在SpringBoot中利用nacos对数据源进行动态刷新

    第二步:配置动态获取nacos配置信息

    package com.mp.demo.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import lombok.Data;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Slf4j
    @Configuration
    @RefreshScope
    @Data
    public class DruidConfiguration
    {
      @Value("${spring.datasource.url}")
      private String dbUrl;
    
      @Value("${spring.datasource.username}")
      private String username;
    
      @Value("${spring.datasource.password}")
      private String password;
    
      @Value("${spring.datasource.driver-class-name}")
      private String driverClassName;
    
      @Bean
      @RefreshScope
      public DruidDataSource dataSource()
      {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(this.dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        return datasource;
      }
    }
    

    这里要注意增加@RefreshScope注解

    第三步:手动刷新数据源

     @GetMapping("/refresh")
      public String refresh() throws SQLException
      {
        DruidDataSource master = SpringUtils.getBean("dataSource");
        master.setUrl(druidConfiguration.getDbUrl());
        master.setUsername(druidConfiguration.getUsername());
        master.setPassword(druidConfiguration.getPassword());
        master.setDriverClassName(druidConfiguration.getDriverClassName());
        master.restart();
        return userName + "<>" + jdbcUrl+"----------"+druidConfiguration.getDbUrl();
      }
    

    相关文章

      网友评论

        本文标题:SpringBoot中利用nacos等配置中心对数据源进行动态刷

        本文链接:https://www.haomeiwen.com/subject/tvoocrtx.html