1. 为什么选择Druid连接池
在Spring Boot项目中,数据库连接池的选择直接影响着应用的性能和稳定性。Druid作为阿里巴巴开源的数据库连接池实现,相比HikariCP、Tomcat JDBC等方案有几个显著优势:
- 监控功能完善:内置StatFilter提供SQL执行监控、URI监控、Session监控等功能,这是其他连接池不具备的
- 防御SQL注入:通过WallFilter提供SQL防火墙功能
- 性能优异:在阿里巴巴内部经受住了双十一等高并发场景考验
- 扩展性强:支持通过Filter机制扩展功能
实际项目中我们发现,当需要监控SQL性能或排查慢查询时,Druid提供的监控界面能节省大量调试时间。而HikariCP虽然性能更好,但缺乏这类运维工具。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 依赖引入
在pom.xml中添加以下依赖(以Spring Boot 2.7.x为例):
xml复制<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.18</version>
</dependency>
这里选择1.2.18版本是因为:
- 这是目前最稳定的版本
- 与Spring Boot 2.x兼容性良好
- 修复了已知的安全漏洞
2.2 基础YML配置
application.yml中最简配置示例:
yaml复制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
关键参数说明:
type必须指定为DruidDataSource- 其他参数与标准DataSource配置一致
3. 高级功能配置详解
3.1 监控中心配置
启用Druid内置的监控功能:
yaml复制spring:
datasource:
druid:
stat-view-servlet:
enabled: true
login-username: admin
login-password: admin
url-pattern: /druid/*
配置后访问http://localhost:8080/druid即可看到监控页面。实际项目中我们建议:
- 生产环境一定要修改默认账号密码
- 通过Spring Security等机制限制访问IP
3.2 SQL防火墙配置
防止SQL注入的WallFilter配置:
yaml复制spring:
datasource:
druid:
filter:
wall:
enabled: true
config:
drop-table-allow: false
multi-statement-allow: true
在金融类项目中,我们会设置更严格的规则,比如禁止SELECT *查询。
3.3 连接池调优参数
生产环境推荐配置:
yaml复制spring:
datasource:
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
参数选择依据:
initial-size:根据应用启动时的并发量设置max-active:一般设置为平均QPS的2-3倍time-between-eviction-runs-millis:建议1分钟检查一次空闲连接
4. 常见问题排查
4.1 监控页面无法访问
可能原因及解决方案:
- 未启用stat-view-servlet:检查
enabled: true配置 - 路径冲突:确认
url-pattern不与现有接口冲突 - 权限问题:检查是否被Spring Security拦截
4.2 连接泄漏检测
配置连接泄漏检测:
yaml复制spring:
datasource:
druid:
remove-abandoned: true
remove-abandoned-timeout: 180
log-abandoned: true
当发现连接泄漏时:
- 检查是否忘记关闭Connection/Statement/ResultSet
- 检查事务边界是否正确
- 使用
@Transactional时注意传播属性
4.3 多数据源配置
使用dynamic-datasource时的Druid配置:
yaml复制spring:
datasource:
dynamic:
druid:
initial-size: 5
max-active: 20
primary: master
datasource:
master:
url: jdbc:mysql://localhost:3306/master
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3306/slave
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
5. 性能监控实战
5.1 慢SQL监控
配置慢SQL阈值:
yaml复制spring:
datasource:
druid:
filter:
stat:
enabled: true
slow-sql-millis: 1000
log-slow-sql: true
在监控页面可以:
- 查看SQL执行时间分布
- 分析最耗时的SQL
- 定位高频执行的SQL
5.2 Spring Boot Admin集成
将Druid监控数据接入Spring Boot Admin:
java复制@Configuration
public class DruidAdminConfig {
@Bean
public DruidStatViewServletRegistrationBean druidServlet() {
return new DruidStatViewServletRegistrationBean(new StatViewServlet(), "/druid/*");
}
}
这样在Admin界面就能统一查看所有监控指标。
6. 生产环境建议
- 定期升级版本:关注Druid的GitHub发布页,及时修复安全漏洞
- 监控告警:将慢SQL、连接池活跃数等指标接入Prometheus
- 日志分析:结合ELK分析Druid的监控日志
- 压测验证:上线前用JMeter验证连接池参数是否合理
我在实际项目中的经验是,Druid的监控数据对性能调优帮助很大。曾经通过慢SQL监控发现一个N+1查询问题,优化后接口响应时间从2s降到了200ms。
