SpringBoot集成nacos动态刷新数据源的实现示例

时间:2021-05-20

前言

因为项目需要,需要在项目运行过程中能够动态修改数据源(即:数据源的热更新)。这里以com.alibaba.druid.pool.DruidDataSource数据源为例

第一步:重写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; }

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

第二步:配置动态获取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@Datapublic 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(); }

源码地址:https://gitee.com/jackson_hou/RefreshDataSource.git

到此这篇关于SpringBoot集成nacos动态刷新数据源的实现示例的文章就介绍到这了,更多相关SpringBoot nacos动态刷新数据源内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章