【Spring Boot】Druid 连接池 YAML 配置详解
文章目录
- 一、Druid 连接池 YAML 配置详解
- 基础配置
- 高级配置
- 监控配置
- 过滤器详细配置
- 多数据源配置
- 生产环境推荐配置
- 配置优化建议
- 二、拓展
- 1、分析慢SQL日志的方法
- 1. 查看慢SQL日志
- 访问Druid监控界面
- 直接查看日志文件
- 2. 分析慢SQL的关键维度
- 3. 常见慢SQL优化方法
- 索引优化
- SQL语句重构
- 数据库设计优化
- 4. 定期分析建议
- 5. 高级分析技巧
一、Druid 连接池 YAML 配置详解
Druid 是阿里巴巴开源的数据库连接池,提供强大的监控和扩展功能。以下是完整的 YAML 配置说明和优化建议。
基础配置
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:# 基本连接配置url: jdbc:mysql://localhost:3306/db_name?useSSL=false&serverTimezone=UTCusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver# 连接池大小配置initial-size: 5 # 初始化连接数min-idle: 5 # 最小空闲连接数max-active: 20 # 最大连接数max-wait: 60000 # 获取连接等待超时时间(毫秒)# 连接有效性检查validation-query: SELECT 1test-while-idle: true # 空闲时检查连接有效性test-on-borrow: false # 获取连接时不检查(影响性能)test-on-return: false # 归还连接时不检查# 连接回收配置time-between-eviction-runs-millis: 60000 # 检查间隔(毫秒)min-evictable-idle-time-millis: 300000 # 连接最小生存时间max-evictable-idle-time-millis: 900000 # 连接最大生存时间
高级配置
spring:datasource:druid:# 连接属性配置connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000# 过滤器配置(统计、监控、防火墙等)filters: stat,wall,slf4j# 启用PSCache(MySQL建议关闭)pool-prepared-statements: falsemax-pool-prepared-statement-per-connection-size: -1# 全局数据源配置use-global-data-source-stat: true# 连接泄漏检测remove-abandoned: true # 是否移除泄露连接remove-abandoned-timeout: 1800 # 泄露连接回收超时(秒)log-abandoned: true # 记录泄露日志# 异步初始化async-init: true
监控配置
spring:datasource:druid:# Web统计过滤器配置web-stat-filter:enabled: trueurl-pattern: /*exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"session-stat-enable: truesession-stat-max-count: 100# StatViewServlet配置(监控页面)stat-view-servlet:enabled: trueurl-pattern: /druid/*reset-enable: falselogin-username: adminlogin-password: adminallow: 127.0.0.1,192.168.1.1deny: 192.168.1.100
过滤器详细配置
spring:datasource:druid:filter:stat:enabled: truelog-slow-sql: true # 记录慢SQLslow-sql-millis: 1000 # 慢SQL阈值(毫秒)merge-sql: true # 合并相似SQLwall:enabled: trueconfig:drop-table-allow: false # 禁止DROP TABLEalter-table-allow: false # 禁止ALTER TABLEdelete-where-none-check: true # 检查无WHERE的DELETEconfig:enabled: true
多数据源配置
spring:datasource:druid:# 主数据源master:url: jdbc:mysql://master-host:3306/dbusername: master_userpassword: master_passinitial-size: 5max-active: 20# 从数据源slave:enabled: trueurl: jdbc:mysql://slave-host:3306/dbusername: slave_userpassword: slave_passinitial-size: 5max-active: 15# 公共配置stat-view-servlet:enabled: trueurl-pattern: /druid/*
生产环境推荐配置
spring:datasource:druid:# 连接池核心配置initial-size: 5min-idle: 5max-active: 50max-wait: 60000# 连接有效性检查validation-query: SELECT 1test-while-idle: truetest-on-borrow: falsetest-on-return: false# 连接回收time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000# 监控配置filters: stat,wallweb-stat-filter:enabled: truestat-view-servlet:enabled: truelogin-username: monitorlogin-password: monitor123allow: 10.10.10.1,192.168.1.0/24# 防火墙配置filter:wall:config:delete-where-none-check: truemulti-statement-allow: false
配置优化建议
-
连接池大小:
initial-size
和min-idle
建议相同max-active
根据应用负载调整,通常20-100
-
MySQL 8小时问题:
time-between-eviction-runs-millis: 60000 # 1分钟检查一次 min-evictable-idle-time-millis: 28000000 # 7小时46分钟(略小于8小时)
-
监控安全:
- 务必修改监控页面的默认账号密码
- 配置IP白名单限制访问
-
慢SQL监控:
filter:stat:slow-sql-millis: 1000 # 定义慢SQL阈值log-slow-sql: true # 记录慢SQL
-
防火墙规则:
- 生产环境应启用wall过滤器
- 根据业务需要配置安全规则
通过以上配置,可以充分发挥Druid连接池的高性能和强大监控能力,适合企业级应用场景。
二、拓展
1、分析慢SQL日志的方法
开启慢SQL日志后(Druid配置如下),您可以通过以下步骤有效分析和优化慢查询:
filter:stat:enabled: true# 慢SQL记录log-slow-sql: trueslow-sql-millis: 1000 # 执行超过1秒的SQL会被记录merge-sql: true # 合并相似SQL
1. 查看慢SQL日志
访问Druid监控界面
- 应用启动后访问
http://你的域名或IP:端口/druid
- 使用配置的用户名密码登录(示例中为ruoyi/123456)
- 在"SQL监控"和"慢SQL"标签页查看记录
直接查看日志文件
如果配置了日志输出,可以在应用日志中搜索"slow sql"相关记录
2. 分析慢SQL的关键维度
在监控界面中,重点关注以下列:
列名 | 说明 | 分析要点 |
---|---|---|
SQL | SQL语句内容 | 识别是否有全表扫描、复杂连接 |
执行次数 | 该SQL被执行的次数 | 高频SQL优先优化 |
执行时间 | 总耗时和最大耗时 | 找出最耗时的操作 |
影响行数 | 扫描/返回的行数 | 检查是否扫描过多数据 |
数据源 | 来自主库还是从库 | 判断读写分离是否合理 |
3. 常见慢SQL优化方法
索引优化
- 检查WHERE条件字段是否有索引
EXPLAIN SELECT * FROM users WHERE username = 'test';
- 避免索引失效的情况:
- 使用
!=
、<>
、NOT IN
- 对字段进行函数操作
WHERE DATE(create_time) = '2023-01-01'
- 隐式类型转换
WHERE user_id = '123'
(user_id是int)
- 使用
SQL语句重构
- 减少
SELECT *
,只查询需要的列 - 拆分复杂查询,避免多表JOIN时产生笛卡尔积
- 使用分页查询避免大数据量返回
-- 不好 SELECT * FROM orders;-- 较好 SELECT id, order_no, amount FROM orders LIMIT 20 OFFSET 0;
数据库设计优化
- 考虑大表分库分表
- 适当增加冗余字段减少JOIN操作
- 对TEXT/BLOB大字段单独存表
4. 定期分析建议
- 设置自动报表:定期(如每周)导出慢SQL统计
- 建立优化清单:按影响程度(Pareto原则)排序处理
- 性能测试验证:优化后对比执行计划和时间
- 监控趋势:观察慢SQL数量是否随业务增长而增加
5. 高级分析技巧
-
使用
EXPLAIN
分析执行计划:EXPLAIN FORMAT=JSON SELECT * FROM orders WHERE user_id = 100;
-
关联应用日志:将慢SQL与当时的请求参数、业务场景关联分析
-
使用性能分析工具:
- Percona Toolkit的
pt-query-digest
- MySQL Enterprise Monitor
- VividCortex等专业APM工具
- Percona Toolkit的
通过系统性地分析慢SQL日志,您可以显著提升数据库性能,通常能解决80%以上的数据库性能问题。