当前位置:网站首页>Nacos配置中心动态刷新数据源
Nacos配置中心动态刷新数据源
2022-07-27 09:23:00 【IT-老牛】
前言
因为项目需要,需要在项目运行过程中能够动态修改数据源(即:数据源的热更新)。这里以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.easyshop.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;
/** * * 描述:如果不使用代码手动初始化DataSource的话 */
@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;
// @Value("${spring.datasource.initialSize}")
// private int initialSize;
//
// @Value("${spring.datasource.minIdle}")
// private int minIdle;
//
// @Value("${spring.datasource.maxActive}")
// private int maxActive;
//
// @Value("${spring.datasource.maxWait}")
// private int maxWait;
//
// @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
// private int timeBetweenEvictionRunsMillis;
//
// @Value("${spring.datasource.minEvictableIdleTimeMillis}")
// private int minEvictableIdleTimeMillis;
//
// @Value("${spring.datasource.validationQuery}")
// private String validationQuery;
//
// @Value("${spring.datasource.testWhileIdle}")
// private boolean testWhileIdle;
//
// @Value("${spring.datasource.testOnBorrow}")
// private boolean testOnBorrow;
//
// @Value("${spring.datasource.testOnReturn}")
// private boolean testOnReturn;
//
// @Value("${spring.datasource.poolPreparedStatements}")
// private boolean poolPreparedStatements;
//
// @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
// private int maxPoolPreparedStatementPerConnectionSize;
//
// @Value("${spring.datasource.filters}")
// private String filters;
//
// @Value("${spring.datasource.connectionProperties}")
// private String connectionProperties;
//
// @Value("${spring.datasource.useGlobalDataSourceStat}")
// private boolean useGlobalDataSourceStat;
@Bean
@RefreshScope
public DruidDataSource dataSource()
{
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(this.dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
//configuration
// datasource.setInitialSize(initialSize);
// datasource.setMinIdle(minIdle);
// datasource.setMaxActive(maxActive);
// datasource.setMaxWait(maxWait);
// datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
// datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
// datasource.setValidationQuery(validationQuery);
// datasource.setTestWhileIdle(testWhileIdle);
// datasource.setTestOnBorrow(testOnBorrow);
// datasource.setTestOnReturn(testOnReturn);
// datasource.setPoolPreparedStatements(poolPreparedStatements);
// datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
// datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);
// try
// {
// datasource.setFilters(filters);
// }
// catch (SQLException e)
// {
// log.error("druid configuration initialization filter: " + e);
// }
// datasource.setConnectionProperties(connectionProperties);
return datasource;
}
}
这里要注意增加@RefreshScope注解
第三步:手动刷新数据源
@Autowired
private DruidConfiguration druidConfiguration;
@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 druidConfiguration.getDbUrl();
}
到此这篇关于SpringBoot集成nacos动态刷新数据源的实现示例的文章就介绍到这了
边栏推荐
- 【武汉理工大学】考研初试复试资料分享
- C language takes you to tear up the address book
- Thermal renewal and its principle
- 如何注册码云账号
- ES6 new - array part
- [C language - zero foundation lesson 6] input and output sentence format and compound sentence
- 七月集训(第04天) —— 贪心
- 七月集训(第23天) —— 字典树
- Programming style
- NCCL (NVIDIA Collective Communications Library)
猜你喜欢

BGP的社团属性

Longest string without duplicate characters

拟搬迁!211中国石油大学(华东)新校区,正式启用!

Lua函数嵌套调用

【微信小程序】农历公历互相转换

Antdesign a-modal user-defined instruction realizes dragging and zooming in and out

BGP federal experiment

Monitoring artifact: Prometheus easy to get started, really fragrant!

Read the paper learning to measure changes: full revolutionary Siamese metric networks for scene change detect

NCCL (NVIDIA Collective Communications Library)
随机推荐
监控神器:Prometheus 轻松入门,真香!
七月集训(第08天) —— 前缀和
Thermal renewal and its principle
Vscode uses remote SSH connection and the solution of connection failure
You haven't heard of such 6 question brushing websites, have you? Are you out?
Hard core structure, violent interpretation
[C language _ study _ exam _ review lesson 3] overview of ASCII code and C language
【武汉理工大学】考研初试复试资料分享
二叉树遍历
HBuilder 微信小程序中运行uni-app项目
Nutrecipes developed based on arkui ETS
Svg drawing curve
The fourth day of learning C language
Restful
2022软件测试面试题 200道大厂面试真题 刷完拿到10k职位
面试官:什么是脚手架?为什么需要脚手架?常用的脚手架有哪些?
ES6 new - function part
2022 software test interview questions 200 big factory interview true questions brushed to get 10K positions
Easy language programming: allow the screen reading software to obtain the text of the label control
The fifth day of learning C language