Spring 中数据源配置和连接池是实际生产项目中最核心的部分之一。下面系统性地介绍目前(2025 年)主流的几种数据源 + 连接池配置方式,涵盖 Spring Boot 2.x/3.x。
1. 主流连接池对比(2025 年最新推荐顺序)
| 连接池 | 性能 | 稳定性 | Spring Boot 3 原生支持 | 推荐场景 |
|---|---|---|---|---|
| HikariCP | ★★★★★ | ★★★★★ | 默认(最优) | 99% 的生产项目直接用即可 |
| Druid | ★★★★☆ | ★★★★★ | 需要额外引入 starter | 需要强大监控、SQL 防火墙 |
| Tomcat JDBC | ★★★☆☆ | ★★★★☆ | 原生支持 | 老项目、嵌入式 Tomcat 时 |
| Vibur | ★★★★★ | ★★★☆☆ | 无 starter | 极致性能场景 |
| BeeCP | ★★★★★ | ★★★☆☆ | 无 starter | 国产极致性能追求 |
结论:除非有特殊监控需求,否则直接使用 HikariCP 就够了。
2. Spring Boot 3.x(推荐)最简洁配置
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver # MySQL 8+
# driver-class-name: org.postgresql.Driver # PostgreSQL
# driver-class-name: oracle.jdbc.OracleDriver # Oracle
# HikariCP 专用调优参数(大部分场景这些就够了)
hikari:
minimum-idle: 5 # 最小空闲连接数
maximum-pool-size: 20 # 最大连接数(根据业务压力调整)
idle-timeout: 300000 # 空闲连接存活最大时间 5分钟
max-lifetime: 1200000 # 连接最大存活时间 20分钟(小于 MySQL wait_timeout)
connection-timeout: 30000 # 连接超时 30秒
pool-name: HikariCP-MyApp
read-only: false
Spring Boot 3.x 会自动识别并使用 HikariCP,无需额外依赖。
3. 手动配置 DataSource(多数据源、生产复杂场景常用)
@Configuration
public class DataSourceConfig {
@Bean
@Primary
@ConfigurationProperties("spring.datasource.hikari")
public DataSource dataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
// 如果想完全手动控制
@Bean
@Primary
public DataSource dataSourceManual() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("root");
config.setPassword("123456");
config.setDriverClassName("com.mysql.cj.jdbc.Driver");
// 关键调优参数
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
config.addDataSourceProperty("useServerPrepStmts", "true");
config.addDataSourceProperty("useLocalSessionState", "true");
config.addDataSourceProperty("rewriteBatchedStatements", "true");
config.addDataSourceProperty("cacheResultSetMetadata", "true");
config.addDataSourceProperty("cacheServerConfiguration", "true");
config.addDataSourceProperty("elideSetAutoCommits", "true");
config.addDataSourceProperty("maintainTimeStats", "false");
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);
config.setConnectionTimeout(30000);
config.setIdleTimeout(600000);
config.setMaxLifetime(1800000);
config.setPoolName("MyHikariPool");
return new HikariDataSource(config);
}
}
4. 阿里 Druid 配置(需要监控时)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.23</version>
</dependency>
yaml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
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
# 开启 Druid 监控页面
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin
访问:http://localhost:8080/druid
### 5. 生产环境 HikariCP 推荐参数(2025 年最新实践)
yaml
spring:
datasource:
hikari:
# 连接池大小根据 CPU 核数和业务类型调整
maximum-pool-size: 20 # 普通 Web:CPU核数×4 ~ ×8
minimum-idle: 5 # 建议和 maximum-pool-size 保持一致或略低
idle-timeout: 300000 # 5 分钟
max-lifetime: 1200000 # 20 分钟(必须 < 数据库 wait_timeout)
connection-timeout: 30000
leak-detection-threshold: 60000 # 超过 60s 未归还连接就报警(排查连接泄漏神器)
initialization-fail-timeout: 1 # 启动失败策略
allow-pool-suspension: true
pool-name: AppHikariPool
register-mbeans: true # JMX 监控
### 6. 多数据源配置示例(读写分离、主从)
java
@Configuration
public class DataSourceConfig {
@Bean
@Primary
@ConfigurationProperties("spring.datasource.master.hikari")
public DataSource masterDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean
@ConfigurationProperties("spring.datasource.slave.hikari")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean
public DataSource routingDataSource(
@Qualifier("masterDataSource") DataSource master,
@Qualifier("slaveDataSource") DataSource slave) {
ReplicationRoutingDataSource routing = new ReplicationRoutingDataSource();
Map<Object, Object> map = new HashMap<>();
map.put("master", master);
map.put("slave", slave);
routing.setTargetDataSources(map);
routing.setDefaultTargetDataSource(master);
return routing;
}
}
“`
总结推荐(2025 年)
| 场景 | 推荐方案 |
|---|---|
| 普通业务系统 | Spring Boot 默认 HikariCP |
| 需要详细监控 | Druid |
| 极致性能要求 | 手动调优 HikariCP |
| 多数据源/读写分离 | 手动配置 + RoutingDataSource 或 ShardingSphere |
直接复制上面的 Spring Boot 3 + HikariCP 配置到项目里,99% 的项目都能跑得又快又稳。如果还有具体数据库(MySQL、PostgreSQL、Oracle、ClickHouse 等)或特殊场景的需求,可以继续问我!