1. 为什么选择Druid连接池
在Java生态中,数据库连接池的选择直接影响着应用的性能和稳定性。Druid作为阿里巴巴开源的数据库连接池实现,相比HikariCP、Tomcat JDBC等方案,最大的特点是提供了完善的监控和统计功能。我在实际项目中使用Druid已经超过5年,特别是在Spring Boot项目中集成druid-spring-boot-starter后,配置复杂度大幅降低。
Druid的核心优势主要体现在三个方面:
- 监控能力:内置支持SQL执行监控、URI监控、Session监控等
- 防御能力:提供SQL注入防护、配置加密等企业级功能
- 扩展性:Filter机制支持自定义扩展,WallFilter等内置过滤器开箱即用
提示:对于中小型项目,如果不需要复杂的监控功能,HikariCP可能是更轻量的选择。但需要企业级功能时,Druid的优势就显现出来了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础集成步骤
2.1 依赖配置
首先在pom.xml中添加starter依赖。注意要同时引入Druid核心包和Spring Boot Starter:
xml复制<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
我建议始终使用最新稳定版,可以通过Maven中央仓库查询最新版本号。这个starter会自动引入druid核心包,不需要单独声明。
2.2 基础配置
在application.yml中配置最基本的数据源参数:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
这里有个容易踩的坑:type属性必须显式指定为DruidDataSource,否则Spring Boot会默认使用HikariCP。
2.3 验证集成
通过一个简单的测试验证连接池是否生效:
java复制@SpringBootTest
class DruidIntegrationTest {
@Autowired
private DataSource dataSource;
@Test
void testDataSourceType() {
assertTrue(dataSource instanceof DruidDataSource);
}
}
如果测试通过,说明Druid已经成功集成到Spring Boot中。
3. 高级配置与优化
3.1 连接池参数调优
Druid有几十个可配置参数,以下是生产环境推荐的核心参数配置:
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
参数调优需要考虑以下因素:
- 应用并发量:max-active应根据QPS合理设置
- 数据库承受能力:避免连接数设置过高压垮数据库
- 网络环境:网络较差时可适当增大max-wait
我在电商项目中总结的经验值是:max-active = (平均QPS × 平均执行时间(ms)) / 1000 × 2
3.2 监控面板配置
Druid内置了一个功能强大的监控页面,配置如下:
yaml复制spring:
datasource:
druid:
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin
reset-enable: false
访问http://localhost:8080/druid 即可看到监控页面。建议:
- 一定要修改默认账号密码
- 生产环境考虑通过Spring Security增加访问控制
- reset-enable保持false避免误操作清空统计
3.3 过滤器配置
Druid的Filter机制是其强大功能的基石。常用过滤器配置示例:
yaml复制spring:
datasource:
druid:
filters: stat,wall,log4j
wall:
config:
drop-table-allow: false
create-table-allow: true
这里启用了三个内置Filter:
- stat:SQL执行统计
- wall:SQL防火墙
- log4j:日志记录
警告:wall过滤器默认禁止删除表操作,如果需要执行DDL,必须明确配置allow规则。
4. 生产环境最佳实践
4.1 配置加密
数据库密码明文存储在配置文件中存在安全隐患。Druid提供了配置加密功能:
- 首先生成加密密码:
bash复制java -cp druid-1.2.16.jar com.alibaba.druid.filter.config.ConfigTools your_password
- 在配置中使用加密后的值:
yaml复制spring:
datasource:
password: MFyH1Jx4JjU1ZfVvJ8kL+w==
druid:
filter:
config:
enabled: true
4.2 多数据源配置
大型项目往往需要连接多个数据库。配置示例:
java复制@Configuration
public class MultiDataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.druid.slave")
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
}
对应application.yml配置:
yaml复制spring:
datasource:
druid:
master:
url: jdbc:mysql://master:3306/db
username: root
password: 123456
slave:
url: jdbc:mysql://slave:3306/db
username: root
password: 123456
4.3 与MyBatis集成
Druid与MyBatis集成时需要注意事务管理器的配置:
java复制@Bean
public PlatformTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
在MyBatis的SQLSessionFactory中直接注入DruidDataSource即可:
java复制@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
return sessionFactory.getObject();
}
5. 常见问题排查
5.1 连接泄漏诊断
当出现连接泄漏时,可以通过以下方式定位:
- 开启泄漏检测:
yaml复制spring:
datasource:
druid:
remove-abandoned: true
remove-abandoned-timeout: 180
log-abandoned: true
-
检查监控面板的"连接泄漏"标签页
-
分析日志中出现的"abandoned connection"警告
5.2 性能问题排查
如果发现数据库操作变慢,可以:
- 查看监控面板的"SQL监控"页,找出执行时间长的SQL
- 检查慢SQL日志:
yaml复制spring:
datasource:
druid:
filter:
stat:
log-slow-sql: true
slow-sql-millis: 1000
- 分析连接等待情况:
sql复制-- 在数据库执行
SHOW PROCESSLIST;
5.3 监控页面无法访问
如果/druid页面404,检查:
- 是否添加了@ServletComponentScan注解
- 是否配置了正确的url-pattern
- 是否被Spring Security拦截
我遇到最常见的原因是忘记在主类上添加:
java复制@ServletComponentScan
6. 进阶技巧
6.1 自定义监控指标
通过Druid的StatFilter可以扩展自定义监控:
java复制@WebFilter(filterName = "druidStatFilter", urlPatterns = "/*")
public class CustomStatFilter extends StatFilter {
@Override
protected void handleSlowSql(StatementProxy statement, long millis) {
// 自定义慢SQL处理逻辑
}
}
6.2 动态配置更新
Druid支持运行时动态调整参数:
java复制DruidDataSource dataSource = (DruidDataSource)SpringContext.getBean("dataSource");
dataSource.setMaxActive(50); // 动态修改最大连接数
注意:动态修改配置后建议调用dataSource.restart()使配置立即生效
6.3 与Prometheus集成
将监控数据导出到Prometheus:
- 添加依赖:
xml复制<dependency>
<groupId>io.github.shenjianeng</groupId>
<artifactId>druid-spring-boot-starter-prometheus</artifactId>
<version>1.0.0</version>
</dependency>
- 配置暴露端点:
yaml复制management:
endpoints:
web:
exposure:
include: prometheus,druid
这样就能在/metrics端点看到Druid的监控指标了。
