一、整合步骤(最简单方式)
Spring Boot 2.0+ 默认使用 HikariCP,所以只需:
-
引入 JDBC 驱动(如 MySQL)
-
在
application.yml或application.properties中配置数据源参数
示例 Maven 依赖(以 MySQL 为例):
XML
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
无需单独引入 HikariCP,Spring Boot 已自带。
二、YAML 配置示例(含完整参数)
bash
spring:
datasource:
# 基本连接信息
url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# HikariCP 专属配置(spring.datasource.hikari 前缀)
hikari:
# 连接池名称(便于监控)
pool-name: MyHikariPool
# 最大连接数(默认10,根据业务峰值调整)
maximum-pool-size: 20
# 最小空闲连接数(默认10)
minimum-idle: 10
# 连接超时时间(毫秒,默认30000,建议>=5000)
connection-timeout: 30000
# 空闲连接超时淘汰(默认600000,10分钟)
idle-timeout: 600000
# 连接最大存活时间(默认1800000,30分钟,需小于数据库wait_timeout)
max-lifetime: 1800000
# 连接池中连接的默认自动提交模式(默认true)
auto-commit: true
# 连接测试查询(MySQL通常用 SELECT 1)
connection-test-query: SELECT 1
# 验证连接是否有效的超时时间(默认5000)
validation-timeout: 5000
# 连接只读模式(默认false)
read-only: false
# 事务隔离级别(默认使用数据库默认级别)
# transaction-isolation: TRANSACTION_READ_COMMITTED
# 连接泄露检测阈值(毫秒,0表示禁用,建议生产环境开启)
leak-detection-threshold: 60000
# 驱动数据源类名(通常无需指定,自动推断)
# data-source-class-name: com.mysql.cj.jdbc.MysqlDataSource
# 更多驱动特定参数(如缓存预处理、超时等)
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
三、Properties 配置示例(对应上述)
bash
spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.pool-name=MyHikariPool
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=5000
spring.datasource.hikari.leak-detection-threshold=60000
spring.datasource.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=2048
spring.datasource.hikari.data-source-properties.useServerPrepStmts=true
四、完整参数配置清单(按类别)
| 参数名 | 默认值 | 说明 | 推荐值 |
|---|---|---|---|
| 核心连接参数 | |||
maximum-pool-size |
10 | 池中最大连接数 | 根据 QPS * 平均响应时间估算,通常 20~50 |
minimum-idle |
10 | 池中维护的最小空闲连接数 | 建议与 maximum-pool-size 一致(避免频繁创建) |
connection-timeout |
30000 | 获取连接的超时时间(ms) | 业务容忍延迟,建议 ≥5000 |
idle-timeout |
600000 | 空闲连接超时淘汰(ms,需小于 max-lifetime) | 默认即可,若空闲连接多可调小 |
max-lifetime |
1800000 | 连接最大存活时间(ms) | 必须小于数据库 wait_timeout(MySQL 默认 8h) |
| 连接校验 | |||
connection-test-query |
无 | 连接验证 SQL(如 SELECT 1) | 强烈建议设置,避免断连 |
validation-timeout |
5000 | 校验查询超时(ms) | 5000 |
| 事务与性能 | |||
auto-commit |
true | 是否默认自动提交 | 保持 true(Spring 管理事务时会被覆盖) |
read-only |
false | 是否只读连接(可路由到从库) | 根据业务设置 |
transaction-isolation |
数据库默认 | 事务隔离级别(如 TRANSACTION_READ_COMMITTED) | 看业务要求 |
leak-detection-threshold |
0(禁用) | 连接泄露检测阈值(ms),超过则打印警告 | 生产建议 60000(1分钟) |
| 池状态与命名 | |||
pool-name |
自动生成 | 连接池名称(便于日志监控) | 自定义有意义的名称 |
initialization-fail-timeout |
1 | 启动时连接池初始化失败的超时(ms) | 若网络不稳可调大至 30000 |
| 驱动级优化(MySQL) | |||
data-source-properties.cachePrepStmts |
false | 缓存预处理语句 | true |
data-source-properties.prepStmtCacheSize |
25 | 缓存 SQL 数量 | 250 |
data-source-properties.prepStmtCacheSqlLimit |
256 | 单条 SQL 最大缓存长度 | 2048 |
data-source-properties.useServerPrepStmts |
false | 使用服务端预处理 | true |
五、常见调优经验
-
连接数公式:
-
核心数 * 2 + 有效磁盘数(常规)
-
更精确:
最大连接数 = (QPS峰值 / 单连接TPS) * 平均响应时间(s) * 安全系数(1.5)
-
-
max-lifetime必须小于数据库的wait_timeout(MySQL 默认 28800s),建议设为 1800000(30分钟)或更小。 -
leak-detection-threshold生产环境开启,有助于发现未关闭连接,但会消耗少量性能。 -
MySQL 驱动优化参数 (
data-source-properties)强烈推荐配置,可显著提升 SQL 执行效率。
六、验证是否生效
在 @Configuration 类中打印数据源类型:
java
@Autowired
private DataSource dataSource;
@PostConstruct
public void check() {
System.out.println("DataSource class: " + dataSource.getClass().getName());
// 输出应为 com.zaxxer.hikari.HikariDataSource
}