公司动态

SpringBoot集成Druid连接池:性能优化与监控实战

📅 2026/8/11 2:26:17
SpringBoot集成Druid连接池:性能优化与监控实战
1. 为什么选择Druid连接池在SpringBoot项目中数据库连接池的选择直接影响着应用的性能和稳定性。Druid作为阿里巴巴开源的数据库连接池实现相比HikariCP、Tomcat JDBC等方案有几个显著优势首先Druid提供了完善的监控功能。通过内置的StatFilter可以采集SQL执行、连接获取等关键指标这在排查慢SQL或连接泄漏问题时非常有用。例如我们可以在控制台看到SELECT * FROM user WHERE id ? 执行了152次平均耗时23ms其次Druid对防御SQL注入做了特殊优化。它支持配置WallFilter可以拦截可疑的SQL语句。比如当检测到11这种恒真条件时会抛出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 groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.18/version /dependency对于SpringBoot 3.x用户需要使用适配新JDK的版本dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-3-starter/artifactId version1.2.18/version /dependency2.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: 600002.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 allow3.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: pass24. 生产环境最佳实践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.Exception4.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连接数增长过快可能是连接未正确关闭检查是否在所有JDBC操作后调用了close()是否启用了remove-abandonedmax-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。