SpringBoot集成Druid连接池:性能优化与监控实战
2026/8/11 2:26:16 网站建设 项目流程

1. 为什么选择Druid连接池

在SpringBoot项目中,数据库连接池的选择直接影响着应用的性能和稳定性。Druid作为阿里巴巴开源的数据库连接池实现,相比HikariCP、Tomcat JDBC等方案有几个显著优势:

首先,Druid提供了完善的监控功能。通过内置的StatFilter可以采集SQL执行、连接获取等关键指标,这在排查慢SQL或连接泄漏问题时非常有用。例如我们可以在控制台看到:

SELECT * FROM user WHERE id = ? 执行了152次,平均耗时23ms

其次,Druid对防御SQL注入做了特殊优化。它支持配置WallFilter,可以拦截可疑的SQL语句。比如当检测到1=1这种恒真条件时会抛出SQLException。这在安全要求较高的生产环境中尤为重要。

从性能角度看,Druid的连接获取耗时与HikariCP处于同一量级。实测在100并发下,获取连接的平均耗时都在5ms以内。但Druid提供了更多可调节参数,比如:

initial-size: 5 max-active: 20 min-idle: 5

这些参数可以根据实际业务特点精细调整。比如电商大促期间可以适当调大max-active,而平时则保持较小值以节省资源。

提示:Druid 1.2.6+版本已全面适配SpringBoot 2.7+,建议使用最新稳定版以避免兼容性问题。

2. 基础集成步骤

2.1 添加Maven依赖

首先在pom.xml中引入starter依赖。注意不要同时引入spring-boot-starter-jdbc,因为starter已经包含它:

<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.18</version> </dependency>

对于SpringBoot 3.x用户,需要使用适配新JDK的版本:

<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-3-starter</artifactId> <version>1.2.18</version> </dependency>

2.2 配置application.yml

基础配置示例(MySQL场景):

spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 5 max-active: 20 min-idle: 5 max-wait: 60000

2.3 验证连接池生效

在启动类中添加测试代码:

@SpringBootApplication public class DemoApplication { public static void main(String[] args) { ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class, args); DataSource dataSource = ctx.getBean(DataSource.class); System.out.println(dataSource.getClass().getName()); // 应输出com.alibaba.druid.pool.DruidDataSource } }

3. 高级配置与监控

3.1 启用监控统计功能

在yml中添加监控配置:

spring: datasource: druid: stat-view-servlet: enabled: true login-username: admin login-password: admin reset-enable: false web-stat-filter: enabled: true exclusions: "*.js,*.gif,*.jpg,*.css,/druid/*"

访问http://localhost:8080/druid即可看到监控页面。这里可以查看:

  • 活跃连接数变化曲线
  • SQL执行时间分布
  • 慢SQL记录
  • URI请求统计

3.2 配置SQL防火墙

防止SQL注入的WallFilter配置示例:

spring: datasource: druid: filter: wall: enabled: true config: delete-allow: false # 禁止delete语句 drop-table-allow: false # 禁止drop table

当检测到危险SQL时会抛出异常:

SQLException: sql injection violation, comment not allow

3.3 多数据源配置

对于需要连接多个数据库的场景:

@Configuration public class MultiDataSourceConfig { @Bean @ConfigurationProperties("spring.datasource.druid.one") public DataSource dataSourceOne(){ return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties("spring.datasource.druid.two") public DataSource dataSourceTwo(){ return DruidDataSourceBuilder.create().build(); } }

对应yml配置:

spring: datasource: druid: one: url: jdbc:mysql://localhost:3306/db1 username: user1 password: pass1 two: url: jdbc:mysql://localhost:3306/db2 username: user2 password: pass2

4. 生产环境最佳实践

4.1 连接泄漏检测

Druid可以检测未关闭的连接:

spring: datasource: druid: remove-abandoned: true remove-abandoned-timeout: 300 # 5分钟未关闭则回收 log-abandoned: true # 打印泄漏日志

日志会显示类似警告:

WARN - connection holder is not closed, stack: java.lang.Exception

4.2 慢SQL监控

配置慢SQL阈值(单位毫秒):

spring: datasource: druid: filter: stat: slow-sql-millis: 1000 log-slow-sql: true

监控页面会单独展示慢SQL,开发时建议设置为100ms以便早期发现问题。

4.3 与MyBatis集成

结合PageHelper分页插件时,需注意过滤器顺序:

spring: datasource: druid: filters: stat,wall,log4j2

在MyBatis配置中引用数据源:

@MapperScan(basePackages = "com.example.mapper", sqlSessionFactoryRef = "sqlSessionFactory") public class MyBatisConfig { @Bean public SqlSessionFactory sqlSessionFactory( @Qualifier("dataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); factory.setDataSource(dataSource); return factory.getObject(); } }

4.4 常见问题排查

问题1:监控页面无法访问检查是否添加了以下配置:

spring: datasource: druid: stat-view-servlet: enabled: true

问题2:连接数增长过快可能是连接未正确关闭,检查:

  1. 是否在所有JDBC操作后调用了close()
  2. 是否启用了remove-abandoned
  3. max-active是否设置过小

问题3:性能下降尝试调整:

spring: datasource: druid: max-active: 50 # 根据实际负载调整 max-wait: 1000 # 获取连接超时时间(ms) validation-query: SELECT 1 # 连接验证SQL test-while-idle: true

我在实际项目中发现,合理配置initial-size和min-idle能显著减少连接创建开销。对于日均UV10万级的系统,建议初始值设为10,最小空闲保持5。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询