2025年druid连接池配置文件(druid连接池连接失效)

druid连接池配置文件(druid连接池连接失效)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> 

讯享网

最近在项目中使用Druid时,从SpringBoot 1.5.11升级到2.2.13后,通过监控发现连接池属性为默认值,自定义属性值未生效,今天一起探究下Druid连接池自动装配过程。

我们在项目中对于系统配置参数一般采用 “动静分离” 模式:

  • 静态参数:即启动配置文件application.yml中配置的是静态参数,一般不随环境【Dev、Test、Prod】而发生改变
  • 动态参数:该类参数随部署运行环境而变化,一般采用额外properties文件进行配置,SpringBoot应用启动时,进行加载、解析、存入Envionment中。
讯享网
 
讯享网

以上代码在SpringBoot 1.5.11版本运行正常,在SpringBoot2.2.13版本中连接池属性未生效。

 

可以发现:

  • ① 继承于,且实现了接口
  • ② 使用了注解

DruidDataSource属性来源于四部分:

  • System.getPropertis();
  • DruidDataSourceConfig配置类druidDataSource();
  • 基于注解的DruidDataSourceWrapper属性注入;
  • InitializingBean的afterPropertiesSet()方法,使用了DataSourceProperties配置类

DataSourceProperties源码:

讯享网

在这里插入图片描述
讯享网
参见:

  • spring Bean的初始化过程解析
  • Spring源码:Bean 的实例化及初始化过程?

SpringBean初始化源码:

 

BeanPostProcessor的处理方法:
在Bean初始化前,调用所有的方法,在中会进行的注册,即,而中有2个重要的方法:

讯享网

基于注解的属性注入类实际就发生在SpringBean初始化过程中,调用的是的前置处理方法,是一个,它通常被框架添加到容器,用于解析bean组件上的注解,将属性源中的属性设置到bean组件。
该方法的实现如下 (SpringBoot 2.2.13):

 

上面的方法主要做两件事情 :

4.1 获取bean注解@ConfigurationProperties属性

我们点开ConfigurationPropertiesBean.get(this.applicationContext, bean, beanName),发现这样一个方法:

讯享网

我们不难看出是用来返回一个,也就是我们定义的配置类的Bean,既可以是直接注解在配置类本身的也可以是注解在@Bean方法上的(其实就是上文提到的@ConfigurationProperties的两种用法)。当然它也可以返回一个null,如果它没用@ConfigurationProperties注解。

4.2 执行配置属性绑定

 

从以上分析可以看出,ConfigurationPropertiesBindingPostProcessor主要负责以下任务 :

  • 准备配置属性绑定工具;
  • 过滤容器中每个带有注解的bean组件,使用配置属性绑定工具对它们进行配置属性绑定。

注意 : 配置属性的绑定细节由ConfigurationPropertiesBinder负责,而不是由ConfigurationPropertiesBindingPostProcessor负责。

1.5.11版本源码:

讯享网

基于以上代码分析,发现:

版本差异SpringBoot 1.5.11既扫描BeanClass上的注解,又扫描BeanName的注解 (配置类)SpringBoot 2.2.13扫描BeanName或BeanClass的注解,以BeanName (配置类) 优先

这就可以得出以下结论:

  • 在SpringBoot 2.2.13版本中,由于不再扫描BeanClass上的注解,所以导致注解未注入连接池,导致连接池的属性为默认值;
  • 配置类的注解仍然有效
  • InitializingBean的afterPropertiesSet()方法中使用DataSourceProperties的几个属性也同样有效

① 修改配置类

 

② 修改配置文件

讯享网

配置文件可以删除了。

① 修改配置文件

 

① 修改配置类

讯享网

② 修改配置文件

 

配置文件可以删除了。

① 可以添加进VM参数中,比如
② 可以通过代码设置属性值
属性列表如下:

讯享网

详情请查看方法

比较简单,不再赘述。

① 底层开源框架升级时,需明确当前版本到目标版本的差异点,并逐项分析对当前项目的影响;
② 当升级到新版本时,有些属性、配置等可能已经被重命名或删除了,通过添加依赖,能在工程启动过程中,在控制台打印出一些环境配置相关信息,来帮助我们做升级适配。切记修复完升级后的各种问题,记得将依赖项从工程中删除;
③ 公共基础设施依赖,比如Redis、ES等,建议进行二次封装,将第三方库的影响封装在技术组件内部,由统一技术组进行维护适配,降低对应用的影响;
④ 自动化测试的重要性,依赖于人工分析排查仅能解决一部分问题,如果项目中有完备的自动化测试用例,那么框架升级会省时又省心;
⑤ 无论是版本升级,还是其它故障导致的BUG,我们在了解源码的基础上,只需耐心且细心的去DEBUG,就能解决百分之八十的问题,而且对个人而言,也是从“cv程序员”往资深程序员的一种能力成长,不要害怕问题,要敢于直面问题。

小讯
上一篇 2025-05-24 08:05
下一篇 2025-05-11 13:10

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/186931.html