Druid作为阿里巴巴开源的数据库连接池,在性能监控和稳定性方面表现出色。下面我将结合多年实战经验,详细解析如何在SpringBoot项目中配置Druid。
首先需要在application.yml中配置基础数据源参数。这里我推荐以下配置作为生产环境起点:
yaml复制spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/for_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
druid:
db-type: mysql
initial-size: 5
min-idle: 5
max-active: 20
关键参数说明:
- initial-size:连接池初始化时建立的连接数,建议设置为5-10
- min-idle:最小空闲连接数,应与initial-size保持一致避免频繁扩容
- max-active:最大活跃连接数,根据应用并发量调整,一般20-50
连接池的性能调优直接影响系统稳定性,以下是经过生产验证的配置:
yaml复制druid:
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
经验分享:
- max-wait设置为60秒,避免长时间等待导致线程堆积
- 启用test-while-idle而非test-on-borrow,减少获取连接时的性能损耗
- validation-query使用简单SQL,MySQL推荐"SELECT 1",Oracle可用"SELECT 1 FROM DUAL"
Druid的SQL监控和防火墙功能能有效预防SQL注入:
yaml复制druid:
filters: stat,wall
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
注意事项:
- filters必须明确声明stat和wall才能启用监控和防火墙
- slowSqlMillis设置慢SQL阈值(单位毫秒),生产环境建议2000-5000ms
- mergeSql=true会将相似SQL合并统计,减少监控数据量
对于频繁使用预处理语句的应用,需要配置:
yaml复制druid:
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
技术细节:
- 启用pool-prepared-statements可以缓存PreparedStatement
- 每个连接缓存的PS数量建议10-20,过多会占用内存
- 此配置对MyBatis等ORM框架性能提升明显
监控页面包含敏感信息,必须做好安全防护:
yaml复制druid:
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin
reset-enable: false
安全建议:
- 必须修改默认账号密码
- 生产环境建议添加allow配置限制访问IP
- reset-enable设为false防止误操作清空统计数据
Web统计功能可以帮助分析接口性能:
yaml复制druid:
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
使用技巧:
- exclusions排除静态资源,避免干扰数据分析
- 结合Spring Boot Actuator可以获取更全面的性能指标
- 监控数据可用于识别慢接口和优化SQL调用链
连接泄露是常见问题,可通过以下配置预防:
yaml复制druid:
remove-abandoned: true
remove-abandoned-timeout: 1800
log-abandoned: true
排查步骤:
- 设置remove-abandoned=true启用泄露检测
- timeout设置30-60分钟(1800-3600秒)
- 结合日志分析泄露位置
- 重点检查未关闭的ResultSet和Connection
常见原因及解决方案:
排查步骤:
理想连接数计算公式:
code复制连接数 = ((核心数 * 2) + 有效磁盘数)
例如4核服务器带SSD:
code复制(4 * 2) + 1 = 9 → 初始值可设为10
关键监控指标:
JPA配置建议:
yaml复制spring:
jpa:
hibernate:
ddl-auto: validate
show-sql: true
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
最佳实践:
- 生产环境ddl-auto设为validate或none
- 启用format_sql方便日志阅读
- 明确指定方言避免自动检测开销
在实际项目中,我通常会根据压测结果微调连接池参数。一个经验法则是:当TPS不再随连接数增加而提升时,说明已达到最优连接数。Druid的监控面板可以直观展示这些性能指标,是调优过程中的重要参考。