Druid作为阿里巴巴开源的数据库连接池,在Java生态中占据重要地位。它不仅仅是一个高性能的连接池实现,更提供了全面的监控和扩展功能。在Spring Boot项目中,通过druid-spring-boot-starter可以快速集成Druid,这比传统的手动配置方式要便捷得多。
我曾在多个生产项目中采用这种组合,实测下来Druid的稳定性和监控能力确实出色。特别是在高并发场景下,合理的连接池配置配合监控功能,能帮助我们快速定位数据库访问瓶颈。下面我会结合实战经验,详细介绍如何正确使用这个starter。
首先确保你的Spring Boot项目使用的是2.x版本(本文基于2.4.6)。在pom.xml中需要以下基础依赖:
xml复制<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.6</version>
</parent>
<dependencies>
<!-- Spring Boot基础包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis集成 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
添加druid-spring-boot-starter依赖,注意不需要指定版本号,它会继承Spring Boot父POM中的版本管理:
xml复制<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
提示:如果你遇到版本冲突问题,可以显式指定版本号。目前最新稳定版是1.2.6。
在application.properties中配置基本连接信息:
properties复制# 数据库连接配置
spring.datasource.druid.url=jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.druid.username=root
spring.datasource.druid.password=your_password
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
这些参数直接影响连接池的性能表现,需要根据实际业务场景调整:
properties复制# 连接池大小配置
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
# 连接检测配置
spring.datasource.druid.validation-query=SELECT 1
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
# 连接超时与回收配置
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
参数说明:
根据我的经验,生产环境建议这样配置:
properties复制# 生产环境推荐配置
spring.datasource.druid.filters=stat,wall,slf4j
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
spring.datasource.druid.use-global-data-source-stat=true
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin@123
spring.datasource.druid.web-stat-filter.enabled=true
Druid内置了强大的监控功能,通过以下配置启用:
properties复制# 监控配置
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=false
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
# Web统计过滤
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
启动应用后,访问 http://localhost:8080/druid 即可看到监控面板。主要功能包括:
重要:生产环境务必修改默认账号密码,并限制访问IP!
在实际项目中,我们经常需要配置多个数据源。下面是典型的多数据源配置示例:
java复制@Configuration
public class DruidConfig {
@Bean
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.druid.slave")
@Primary
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
// 配置Druid监控
@Bean
public ServletRegistrationBean<StatViewServlet> statViewServlet() {
ServletRegistrationBean<StatViewServlet> bean =
new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
// 监控页面账号密码
bean.addInitParameter("loginUsername", "admin");
bean.addInitParameter("loginPassword", "admin123");
return bean;
}
}
对应的application.properties配置:
properties复制# 主库配置
spring.datasource.druid.master.url=jdbc:mysql://master:3306/db
spring.datasource.druid.master.username=root
spring.datasource.druid.master.password=123456
# 从库配置
spring.datasource.druid.slave.url=jdbc:mysql://slave:3306/db
spring.datasource.druid.slave.username=root
spring.datasource.druid.slave.password=123456
druid-spring-boot-starter的自动配置类DruidDataSourceAutoConfigure通过以下注解实现自动装配:
java复制@Configuration
@ConditionalOnClass(DruidDataSource.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({
DruidSpringAopConfiguration.class,
DruidStatViewServletConfiguration.class,
DruidWebStatFilterConfiguration.class,
DruidFilterConfiguration.class
})
public class DruidDataSourceAutoConfigure {
@Bean
@ConditionalOnMissingBean
public DataSource dataSource() {
return new DruidDataSourceWrapper();
}
}
关键点:
连接数设置:
超时设置:
监控开销:
问题1:连接泄漏
症状:连接数持续增长不释放
解决方案:
properties复制spring.datasource.druid.remove-abandoned=true
spring.datasource.druid.remove-abandoned-timeout=1800
spring.datasource.druid.log-abandoned=true
问题2:慢SQL监控
配置慢SQL阈值(毫秒):
properties复制spring.datasource.druid.filter.stat.slow-sql-millis=1000
spring.datasource.druid.filter.stat.log-slow-sql=true
问题3:监控页面无法访问
检查:
Spring Boot默认使用HikariCP,而国内开发者更熟悉Druid。下面是主要对比:
| 特性 | Druid | HikariCP |
|---|---|---|
| 性能 | 优秀 | 极佳 |
| 监控 | 内置完善 | 需要额外集成 |
| SQL防火墙 | 支持 | 不支持 |
| 扩展性 | 良好 | 一般 |
| 社区支持 | 中文文档丰富 | 国际社区活跃 |
选择建议:
根据我在多个项目中的经验,总结以下最佳实践:
连接数设置公式:
code复制max-active = (平均查询时间(ms) × 峰值QPS) / 1000 + 缓冲数(5-10)
监控配置:
安全建议:
JVM监控集成:
properties复制spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
spring.datasource.druid.stat-view-servlet.reset-enable=false
spring.datasource.druid.web-stat-filter.session-stat-enable=true
从旧版本升级时需要注意:
1.1.x → 1.2.x变化:
配置兼容性:
推荐升级步骤:
Druid支持自定义Filter扩展功能:
java复制@WebFilter(filterName = "myFilter", urlPatterns = "/*")
public class MyDruidFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
// 初始化逻辑
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 过滤逻辑
chain.doFilter(request, response);
}
}
注册自定义Filter:
properties复制spring.datasource.druid.filters=stat,wall,myFilter
默认监控数据存储在内存中,可以通过以下方式持久化:
java复制@Bean
public DruidStatInterceptor druidStatInterceptor() {
return new DruidStatInterceptor();
}
@Bean
@Scope("prototype")
public JdbcDataSourceStat jdbcDataSourceStat() {
return new JdbcDataSourceStat();
}
然后定期将统计数据保存到数据库或文件中。