Java Druid连接池案例如何使用:从入门到实战的完整指南
📚 目录导读
- 为什么选择Druid连接池?
性能优势与监控特性

- 环境准备与依赖配置
Maven/Gradle依赖、JDBC驱动要求
- 核心配置参数详解
初始化大小、最大活动数、超时时间等
- 实战案例:Spring Boot集成Druid
配置类、DataSource注入、SQL监控
- 常见问题与解决方案
连接泄露、慢SQL排查、防火墙绕过
- 问答环节
开发中高频疑问解析
为什么选择Druid连接池?
Java应用与数据库交互时,频繁创建和销毁连接会严重拖慢性能,连接池通过复用连接提升效率,而Druid作为阿里开源的数据库连接池工具,不仅性能优于DBCP/C3P0,还内置了强大的监控和扩展功能,它能实时展示SQL执行时间、连接获取次数、慢SQL日志等,对排查性能瓶颈极有帮助。
核心特性:
- 支持PSCache(预编译语句缓存)
- 内置日志、监控、防御SQL注入等Filter
- 可配置的策略如:
testWhileIdle,保证连接有效性
环境准备与依赖配置
1 Maven依赖(Java 8+)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.20</version> <!-- 使用最新稳定版 -->
</dependency>
若使用Spring Boot,可引入
druid-spring-boot-starter简化配置。
2 数据库驱动
以MySQL为例,需同时引入:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
核心配置参数详解
| 参数名 | 默认值 | 说明 | 推荐值 |
|---|---|---|---|
initialSize |
0 | 初始化连接数 | 5-10 |
maxActive |
8 | 最大活动连接数 | 20-50 (根据并发) |
minIdle |
0 | 最小空闲连接数 | 5 |
maxWait |
-1 (无限等待) | 获取连接最大等待毫秒数 | 3000(3秒) |
timeBetweenEvictionRunsMillis |
60000 | 空闲连接检查周期 | 60000 |
minEvictableIdleTimeMillis |
300000 | 连接最大空闲时间 | 300000 |
testWhileIdle |
true | 空闲时检测连接有效性 | true |
poolPreparedStatements |
false | 是否缓存PreparedStatement | true(可提升性能) |
注意:
validationQuery需设为SELECT 1(MySQL)或SELECT 1 FROM DUAL(Oracle)。
实战案例:Spring Boot集成Druid
1 配置文件(application.yml)
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
druid:
initial-size: 5
max-active: 20
min-idle: 5
max-wait: 3000
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
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
# 监控配置
filters: stat,wall,log4j2
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: false
login-username: admin
login-password: admin123
2 访问Druid监控
启动项目后,访问:
http://localhost:8080/druid/login.html
输入配置的用户名/密码,即可查看:
- 数据源:连接池活动、空闲等实时数据
- SQL监控:执行频率、最慢SQL、事务分布
- URI监控:常见请求耗时统计
3 代码中获取连接(示例)
@Autowired
private DataSource dataSource;
public void query() {
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM user WHERE id = ?")) {
ps.setInt(1, 1);
ResultSet rs = ps.executeQuery();
// 处理结果...
} catch (SQLException e) {
e.printStackTrace();
}
}
常见问题与解决方案
❌ 问题:连接泄露(activeCount持续增长)
原因:未正确关闭Connection、Statement、ResultSet。
解决:
- 使用
try-with-resources自动关闭 - 开启Druid的
removeAbandoned配置:remove-abandoned: true remove-abandoned-timeout-millis: 180000 # 3分钟未归还视为泄露 log-abandoned: true
❌ 问题:慢SQL导致线程阻塞
步骤:
- 在Druid监控页面查看“慢SQL记录”
- 分析执行计划(
EXPLAIN) - 添加索引或优化SQL逻辑
❌ 问题:防火墙(wall filter)误拦截
场景:某些动态SQL如ORDER BY #{column}被拦截。
解决:
- 临时关闭
wallfilter测试 - 调整规则:通过
WallConfig配置白名单(如允许ORDER BY变量)
问答环节
Q1:Druid连接池和HikariCP哪个更好?
A:HikariCP社区活跃、性能略优;但Druid的监控和防御能力更全面(SQL防注入、日志审计),若项目需要可视化监控,Druid是首选;纯追求极致性能可选HikariCP。
Q2:如何动态修改Druid配置?
A:通过DruidDataSource的set方法可运行时调整,但修改maxActive可能导致连接池震荡,更稳妥的方式是:监控页面手动调整或使用配置中心(如Nacos)动态推送。
Q3:testOnBorrow和testWhileIdle有什么区别?
A:
testOnBorrow=true:每次获取连接时都检测,保证连接肯定可用,但性能损耗大testWhileIdle=true:仅在空闲连接检测时验证,推荐开启(配合timeBetweenEvictionRunsMillis)
Q4:出现CLOSE_CONNECTION: Connection closed错误怎么办?
A:通常发生在数据库服务器重启后,连接池中的连接已经失效,解决办法:
- 设置
validationQuery并开启testWhileIdle - 添加
timeBetweenEvictionRunsMillis使Druid定期检查并剔除失效连接
通过本文的配置示例和实战步骤,你可以快速在Spring Boot项目中部署Druid连接池,并利用内置监控优化SQL性能,记得根据业务并发量调整maxActive和minIdle,避免资源浪费或连接等待超时。Druid不仅是连接池,更是数据库健康的守护者。
本文基于Druid v1.2.20撰写,所有URL中的
localhost需替换为实际服务器IP或域名。