使用HikariCP连接池常用配置讲解及注意事项

常遇到的几种错误

Possibly consider using a shorter maxLifetime value

SpringCloud 中使用HikariPool 报错Possibly consider using a shorter maxLifetime value

HikariPool-1 - Failed to validate connection 
com.mysql.cj.jdbc.ConnectionImpl@115a8473 (No operations allowed after connection closed.). 
Possibly consider using a shorter maxLifetime value

Connection is not available, request timed out after xxxxxms

Connection is not available, request timed out after 59089ms

No operations allowed after connection closed

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed

对于以上几种错误,我经过查阅,众说纷纭,大部分解决了的都是(并不是长久之计)

  • 按照提示缩短了maxLifetime到5分钟
  • 增加测试查询语句connection-test-query

来解决问题,并没有实际的分析问题根源或者优化其他配置项,经过查询相关文档、尝试、观察、测试,得出以下结论,给大家讲解,急于处理问题的可以参考下面的配置进行调整,注意标明的注释,可做适当调整,后文我将对常用的配置项进行讲解

常见配置及注释说明,可以使用并根据说明调整

spring:
  datasource:
    hikari: # 时间单位均为ms
      minimum-idle: 5 # 建议不设置,但如使用idle-timeout,该值需要小于maximum-pool-size
      maximum-pool-size: 10 # hikari做过测试根据CPU计算最优最大连接池,如下
      # connections = ((cpu_core_count * 2) + effective_spindle_count)
      # 如4-Core i7,公式为9 = ((4 * 2) + 1),最后一个是有效的主核心数
      auto-commit: true # 默认
      idle-timeout: 300000 # 该值建议小于max-lifetime
      max-lifetime: 600000 # 该值建议小于数据库的连接关闭等待时间,详细的看下面分析
      connection-timeout: 30000 # 默认30s,连接超时会报异常
      # Connection is not avaitabte, request timed out after 59089ms
      validation-timeout: 5000 # 支持JDBC4的是isValid超时时间,不支持的是testQuery超时时间
      connection-test-query: 'SELECT 1' # 支持JDBC4的不建议使用,因为JDBC4的isValid方法效率更高

详细分析

HikariCP官方说明文档

首先确认网络问题

将数据库连接到本地(注意需要保持数据库的配置和线上一致,否则没有可比性,无法得出结论),并进行长时间运行测试,如果没有问题,则是由于网络原因链接超时,造成了关闭的连接本地调用失败、或创建连接超时无法使用,这种情况优化网络配置、增加带宽、将服务和数据库部署在同一网络下等方案即可

maximum-pool-size建议值

HikariCP对Pool-Sizing的论证及建议

hikari做过测试根据CPU计算最优最大连接池,详细的可以看链接的官方讲解,比较长,总结如下

  • connections = ((cpu_core_count * 2) + effective_spindle_count)
  • 如4-Core i7,公式为9 = ((4 * 2) + 1),最后一个是有效的主核心数

minimum-idle

该值HikariCP建议不设置,就使用默认的,也就是同maximum-pool-size一边大,但是实际应用中可能需要保留少一些,随着业务的增加变到maximum-pool-size,而不是长期占用maximum-pool-size这么多的连接数。

  • 所以可以设置一个比较小的、或者常态化下使用的连接量即可,建议5-10即可,不可大于maximum-pool-size

idle-timeout

连接允许在池中闲置的最长时间,默认为600000,即10分钟。只有当minimum-idle小于maximum-pool-size时,这个参数才生效,当空闲连接数超过minimum-idle,而且连接空闲时间超过idle-timeout,则会被移除。

  • 设置时,该值建议小于max-lifetime

max-lifetime

官方建议是比数据库的wait_timeout小几秒,但是MySQL默认一般都是8小时,28800s(数据库单位是s秒),如下图

# 查看数据库的wait_timeout、interactive_timeout
show variables like '%timeout%';

在这里插入图片描述
所以设置有几种方式

  • 根据数据的超时时长,减少一些时间,然后变为毫秒数,配置该值
  • 使用默认值
  • 使用小于默认值的,如5分钟、10分钟、15分钟等

但是该值一定要大于idle-timeout

connection-timeout

连接池等待连接的最大毫秒数,默认为30000ms,也就是30s,允许最小时间是250毫秒,如果小于250毫秒,则被重置回30秒。

  • 根据网络情况,处理器性能,服务可接受超时时长,配置合理的值即可
  • 一般设置短一点,提高程序的响应速度,但是要大于网络的平均响应时长,否则全会连接超时
  • 小于idle-timeout
# 出现这种错误一般就是连接超时了,检查网络响应时间、网络状态等
Connection is not avaitabte, request timed out after 59089ms

validation-timeout

支持JDBC4的驱动,是调用isValid验证连接池中连接有效性的超时时间
不支持JDBC4的驱动,是调用testQuery的超时时间

  • 该值尽量小一些,使用默认值即可,但是要小于connection-timeout

connection-test-query

支持JDBC4的不建议使用,因为JDBC4的驱动有isValid方法,是通过发送数据包验证连接,效率更高
不支持JDBC4的驱动,是执行该配置的SQL,比较重,效率不好

  • 如果没有配置该值,而且驱动不支持JDBC4,会有错误提示,所以没有配置,也没有提示isValid相关错误,即表示支持
<think>好的,我现在要解决用户关于Spring Boot默认连接池配置的问题。首先,我需要回忆Spring Boot的相关知识。记得Spring Boot在配置数据源时会自动选择默认的连接池,但具体是哪个呢?可能用户需要知道默认连接池的类型,以及如何配置它。 首先,我应该确认Spring Boot的版本对默认连接池的影响。比如,在Spring Boot 2.x版本之后,默认连接池从Tomcat换成了HikariCP。这一点很重要,用户可能因为版本不同而遇到不同的配置情况。我需要明确说明这一点,避免混淆。 接下来,用户可能想知道如何配置这个默认连接池。根据引用内容,用户可以通过配置文件(如application.properties或application.yml)来调整连接池的参数,比如spring.datasource.hikari.connection-timeout或者spring.datasource.hikari.maximum-pool-size。这些是常见的配置项,需要一一列举出来,并解释每个参数的作用。 另外,引用中提到可以通过设置spring.datasource.type来指定其他连接池,比如Druid。这也是一个关键点,用户如果有特殊需求可能需要覆盖默认配置,这时候需要给出示例代码,比如spring.datasource.type=com.alibaba.druid.pool.DruidDataSource。但要注意,用户的问题主要是关于默认配置,所以这部分可以作为扩展说明。 然后,关于如何验证连接池是否配置成功,引用中的测试类方法是一个很好的例子。用户可能希望知道如何测试他们的配置是否生效,所以需要给出具体的测试步骤,包括引入依赖、创建测试类并使用@Autowired注入DataSource,然后打印连接信息。这部分需要详细说明,确保用户能够操作。 此外,用户可能需要了解默认连接池的优势,比如HikariCP的高性能,这样他们可以理解为什么Spring Boot选择它作为默认选项。同时,也要提到版本差异,避免用户在使用旧版本时出现困惑。 最后,生成相关问题时要覆盖常见的使用场景,比如如何切换连接池配置参数的作用、性能监控等,这样用户如果有进一步的问题,可以自行参考或继续提问。 现在需要检查是否有遗漏的配置项,比如用户名、密码、URL这些基本配置是否必须,以及连接池的其他参数如空闲超时、最小空闲连接等。同时,要确保所有提到的配置项都正确对应HikariCP的官方文档,避免提供错误的信息。 总结一下,回答的结构应该是先说明默认连接池的类型,然后分点讲解自动配置、手动配置方法,接着给出配置示例和测试方法,最后补充注意事项和相关问题。确保每一步都清晰,并且引用正确的参考资料,比如用户提供的引用[1]和[2],这样回答更具可信度。</think>### Spring Boot 默认连接池配置解析 Spring Boot 从 **2.x 版本**开始,默认使用 **HikariCP** 作为数据源连接池[^1],因其高性能和低资源消耗特性。以下是配置要点及操作步骤: --- #### 一、默认连接池的自动配置逻辑 1. **依赖触发** 当项目中引入 `spring-boot-starter-data-jpa` 或 `spring-boot-starter-jdbc` 时,Spring Boot 自动配置 HikariCP。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> ``` 2. **优先级规则** Spring Boot 按以下顺序检测连接池- HikariCP - Tomcat 连接池 - Commons DBCP2 若检测到 HikariCP 存在,则直接启用[^1]。 --- #### 二、基础配置项(application.properties) ```properties # 数据源基本信息 spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # HikariCP 核心参数 spring.datasource.hikari.connection-timeout=30000 # 连接超时(毫秒) spring.datasource.hikari.maximum-pool-size=10 # 最大连接数 spring.datasource.hikari.minimum-idle=5 # 最小空闲连接 spring.datasource.hikari.idle-timeout=600000 # 空闲连接超时时间 spring.datasource.hikari.max-lifetime=1800000 # 连接最大生命周期 ``` --- #### 三、手动指定其他连接池 若需使用 Druid 等替代方案,需 **显式声明连接池类型** 并排除默认 HikariCP: ```properties spring.datasource.type=com.alibaba.druid.pool.DruidDataSource ``` --- #### 四、连接池配置验证 通过单元测试验证数据源是否生效(需引入 `spring-boot-starter-test`): ```java @SpringBootTest public class DatasourceTest { @Autowired private DataSource dataSource; @Test public void testConnection() throws Exception { System.out.println(dataSource.getClass().getName()); // 输出连接池类型 System.out.println(dataSource.getConnection()); // 测试连接获取 } } ``` 运行测试后,若输出 `com.zaxxer.hikari.HikariDataSource` 表明 HikariCP 已启用[^2]。 --- #### 五、注意事项 1. **版本兼容性** Spring Boot 1.x 默认使用 Tomcat 连接池,升级到 2.x 需注意配置迁移。 2. **监控集成** HikariCP 可通过 JMX 或 Micrometer 监控,Druid 则提供内置监控页面。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值