Spring 数据源配置与连接池

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 等)或特殊场景的需求,可以继续问我!

文章已创建 3070

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部