2025年2月5日安全智能应用发生服务器不可用情况,初步分析为数据库连接池过少,访问量过大导致的线程等待。经查看安全智能应用的配置文件的Druid的数据库连接池参数未生效,经分析是由于配置不规范导致的。下面针对问题进行了说明,并给出了配置规范。
以安全智能应用原有的配置示例(错误的):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| spring: datasource: dynamic: primary: master strict: true datasource: master: url: jdbc:mysql://xxxxxxx driver-class-name: com.mysql.cj.jdbc.Driver username: xxxxx password: xxxx slave: url: jdbc:mysql://XXXXXX driver-class-name: com.mysql.cj.jdbc.Driver username: xxxx password: xxx druid: max-pool-prepared-statement-per-connection-size: 50 min-idle: 1 max-active: 100
|
问题分析
spring.datasource.dynamic.master下没有配置type:com.alibaba.druid.pool.DruidDataSource 属性,这样的结果是不可预测的,会导致一些异常问题。如果没有在spring.datasource.dynamic.master下配置type属性,会出现两种情况:
- 使用的是动态数据源(
dynamic-datasource-spring-boot-starter)这个starter可能会有自己的配置和自动配置逻辑。不会使用自定义配置的Druid数据库连接池。 - 如果
dynamic-datasource-spring-boot-starter没有默认的连接池类型设置(这取决于该starter的具体实现和版本),那么它可能会回退到Spring Boot默认的连接池(如HikariCP,这是Spring Boot 2.x的默认连接池)。
在提供的配置中,druid配置是放在spring.datasource下的,这通常意味着这些配置将应用于默认的数据源,由于使用的是动态数据源,这些配置不会应用到所有数据源。
如果想要为所有数据源应用相同的Druid配置,应该将这些配置放在spring.datasource.dynamic.druid下或者每个数据源下单独配置Druid参数。
正确的配置
方式一: 全局配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| spring: datasource: dynamic: primary: master strict: false druid: initial-size: 5 min-idle: 5 max-active: 100 max-wait: 60000 validation-query: SELECT 1 max-pool-prepared-statement-per-connection-size: 20 datasource: master: url: jdbc:mysql://xxxx username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource slave: url: xxxx username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource
|
方式二: 单独配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| spring: datasource: dynamic: primary: master datasource: master: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://xxxx username: xxxx password: xxx druid: initial-size: 5 min-idle: 5 max-active: 100 max-wait: 60000 max-pool-prepared-statement-per-connection-size: 20 slave: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://xxxxx username: xxxx password: xxxx druid: initial-size: 5 min-idle: 5 max-active: 100 max-wait: 60000 max-pool-prepared-statement-per-connection-size: 20
|