当前位置: 代码网 > it编程>编程语言>Java > SpringBoot实现数据源配置与连接池的两种方案

SpringBoot实现数据源配置与连接池的两种方案

2026年07月16日 Java 我要评论
数据源(datasource)是应用与数据库之间的桥梁,连接池则是对数据库连接进行复用管理的组件。springboot 默认使用 hikaricp,也可切换为 druid。这篇把配置、监控、调优说清楚

数据源(datasource)是应用与数据库之间的桥梁,连接池则是对数据库连接进行复用管理的组件。springboot 默认使用 hikaricp,也可切换为 druid。这篇把配置、监控、调优说清楚。

一、为什么需要连接池

没有连接池:
  请求进来 → 创建连接 → 执行sql → 关闭连接
  (每次都要 tcp 握手,耗时 20-50ms)

有连接池:
  启动时创建一批连接放在池中
  请求进来 → 从池中取连接 → 执行sql → 归还到池
  (省掉连接建立时间,接近 0ms)

连接池的核心参数:

  • 最小空闲连接数
  • 最大活跃连接数
  • 连接超时时间
  • 空闲连接存活时间

二、hikaricp(springboot 默认)

1. 配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/seckill_db?servertimezone=asia/shanghai&useunicode=true&characterencoding=utf-8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.driver
    hikari:
      # 连接池配置
      maximum-pool-size: 20           # 最大连接数
      minimum-idle: 5                 # 最小空闲连接
      idle-timeout: 600000            # 空闲超时(毫秒)
      max-lifetime: 1800000           # 连接最大存活时间
      connection-timeout: 30000       # 获取连接超时
      connection-test-query: select 1 # 心跳检测sql

2. 监控配置

spring:
  datasource:
    hikari:
      pool-name: seckillpool
      register-mbeans: true  # 开启 jmx 监控

通过 jconsole 或 visualvm 连接到应用,可以查看连接池的状态:

  • 活跃连接数
  • 空闲连接数
  • 等待获取连接的线程数
  • 连接创建/销毁次数

三、druid(阿里,功能更丰富)

1. 引入依赖

<dependency>
    <groupid>com.alibaba</groupid>
    <artifactid>druid-spring-boot-starter</artifactid>
    <version>1.2.20</version>
</dependency>

2. 配置

spring:
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/seckill_db?servertimezone=asia/shanghai
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.driver
      # 连接池配置
      initial-size: 5               # 初始连接数
      min-idle: 5                   # 最小空闲
      max-active: 20                # 最大活跃
      max-wait: 30000               # 获取连接超时
      # 监控统计
      filters: stat,wall            # stat=统计,wall=防火墙
      filter:
        stat:
          slow-sql-millis: 2000     # 慢sql阈值
          log-slow-sql: true
      # web 监控
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: /druid/*
      # druid 监控页面
      stat-view-servlet:
        enabled: true
        login-username: admin
        login-password: 123456
        url-pattern: /druid/*
        allow: 127.0.0.1

3. 监控页面

配置后访问 http://localhost:9090/druid/index.html

  • 数据源面板:连接池状态
  • sql 监控:执行次数、耗时、慢sql
  • url 监控:接口访问统计
  • 防火墙:sql 注入防御

4. 慢sql 监控

@configuration
public class druidconfig {

    @bean
    public filterregistrationbean<webstatfilter> webstatfilter() {
        filterregistrationbean<webstatfilter> bean = new filterregistrationbean<>();
        bean.setfilter(new webstatfilter());
        bean.addurlpatterns("/*");
        bean.addinitparameter("exclusions", "*.js,*.css,/druid/*");
        return bean;
    }
}

四、连接池参数调优

1. 公式估算

/**
 * 最大连接数估算公式:
 *   核心数 × (1 + 等待时间 / 处理时间)
 *
 * 举例:
 *   cpu 4 核,sql 执行 1ms,等待数据库返回 9ms
 *   最大连接数 = 4 × (1 + 9/1) = 40
 *
 * 注意:不要设太大,过大会增加上下文切换开销
 */

2. 常见配置参考

# 一般业务系统
maximum-pool-size: 20
minimum-idle: 5
# 高并发系统(如秒杀)
maximum-pool-size: 50
minimum-idle: 10
# 后台管理系统(低并发)
maximum-pool-size: 10
minimum-idle: 3

五、数据源加密

spring:
  datasource:
    password: enc(加密后的密码)  # 配合 jasypt
@configuration
public class datasourceconfig {

    @bean
    @configurationproperties(prefix = "spring.datasource")
    public datasource datasource() {
        return datasourcebuilder.create().build();
    }
}

六、多数据源配置

spring:
  datasource:
    dynamic:
      primary: master
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/seckill_db
          username: root
          password: 123456
        slave:
          url: jdbc:mysql://192.168.1.100:3306/seckill_db_read
          username: root
          password: 123456
@service
@ds("slave")
public class productqueryservice {
    // 查询走从库
}

七、常见问题

1. 连接泄漏

// ❌ 错误:用完连接没归还
@getmapping("/query")
public resultvo<?> query() {
    connection conn = datasource.getconnection();
    // 执行sql...
    // 忘记 close() → 连接泄漏
    return resultvo.success(data);
}

// ✅ 正确:用完关闭
public void query() {
    try (connection conn = datasource.getconnection()) {
        // try-with-resources 自动关闭
    }
}

2. 连接超时

spring:
  datasource:
    hikari:
      connection-timeout: 30000  # 默认 30 秒
      # 如果数据库挂了,连接池会在 30 秒后报错
      # 设为更小值可以快速失败
      # connection-timeout: 5000

3. kill 连接后恢复

-- mysql 中 kill 了某个连接
-- 连接池需要心跳检测来重建连接
select 1  -- 默认的心跳检测 sql

八、hikaricp vs druid

对比hikaricp(springboot默认)druid(阿里)
性能⭐⭐⭐⭐⭐ 最快⭐⭐⭐⭐ 快
监控jmx 方式✅ web 管理页面
sql 分析❌ 不支持✅ 慢sql、防火墙
配置复杂度简单中等
依赖大小150kb2mb

建议:

  • 一般项目用 hikaricp 就够了,springboot 默认省事
  • 需要监控和 sql 分析 → druid(druid 监控页面很好用)
  • 秒杀系统可以用 hikaricp,性能第一

九、秒杀系统连接池配置

spring:
  datasource:
    hikari:
      maximum-pool-size: 30       # 秒杀场景适当调大
      minimum-idle: 10
      idle-timeout: 300000
      connection-timeout: 5000    # 快速失败
      max-lifetime: 1200000
      connection-test-query: select 1

总结

连接池的核心:
  复用连接,省掉 tcp 握手开销
  控制并发,防止数据库被打垮

配置原则:
  不是越大越好(连接池过大会增加上下文切换)
  根据 cpu 核数 + sql 执行时间估算
  加监控,调优有依据

以上就是springboot实现数据源配置与连接池的两种方案的详细内容,更多关于springboot数据源配置与连接池的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com