HikariCP
Hikari 光 数据库连接池 笔记
brettwooldridge/HikariCP
https://github.com/brettwooldridge/HikariCP
Spring Boot 在 2.0 版本中把 HikariCP 作为其默认的 JDBC 连接池。
Springboot 2.0选择HikariCP作为默认数据库连接池的五大理由
http://blog.didispace.com/Springboot-2-0-HikariCP-default-reason/
查看 Hikari 连接池状态
只看 hikari 连接池状态可以只开 HikariPool 的debug日志
直接编辑 logback.xml
<logger name="com.zaxxer.hikari.pool.HikariPool" level="debug"/>
或修改 spring 配置
logging:
com:
zaxxer:
hikari: debug
可看到日志
2022-07-20 12:45:10.622 [http-nio-8181-exec-123] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Timeout failure stats (total=100, active=100, idle=0, waiting=49)
2022-07-20 12:45:13.965 [HikariPool-1 housekeeper] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Pool stats (total=100, active=100, idle=0, waiting=49)
【问题记录】HikariCP 连接池线上问题排查
https://juejin.cn/post/6923116045712490510
Hikari 数据库连接池配置
【追光者系列】Hikari连接池大小多大合适?(第一弹)
https://juejin.im/post/5ad44c9b6fb9a028d70112e0
【追光者系列】Hikari连接池大小多大合适?(第二弹)
https://juejin.im/post/5ad44d716fb9a028bd4cc8f7
Hikari 的所有时间配置项单位都是毫秒
connectionTimeout:30000(30秒)
从连接池获取可用连接的超时时间,如果超过此时间而没有获取可用的连接,则会抛出 SQLException。
可设置的最小值为 250 ms,默认值 30000 ms(30秒)
假如此时间内没有获取到可用连接则抛出异常:
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
maximumPoolSize:10
连接池中最大连接数,包括闲置和使用中的连接,默认值 10
当连接池达到最大连接数时,调用 getConnection()
方法会阻塞最多 connectionTimeout
毫秒,然后抛出异常。
maxLifetime:1800000(30分钟)
连接池中连接的最长生命周期。
使用中的连接永远不会过期,只有空闲的连接会过期并被删除。
强烈建议设置此参数,并且必须小于底层数据库的连接超时时间(比如 MySQL 的 wait_timeout 默认8小时)。
设为 0 表示永不过期,取决于 idleTimeout
配置项
允许设置的最小值是 30000ms,默认值 1800000ms(30分钟)
minimumIdle
最小空闲连接数,默认值等于 maximumPoolSize
idleTimeout:600000(10分钟)
连接允许在池中闲置的最长时间,只有当 minimumIdle
被显式设置的小于 maximumPoolSize
时才生效。
当连接池中空闲连接数缩减到 minimumIdle
后,就不再减少空闲连接。
设置为 0 表示空闲连接永不过期,允许设置的最小值是 10000ms,默认值 600000ms(10分钟)
问题
No operations allowed after connection closed
2022-10-31 18:08:12.490 [http-nio-8181-exec-5] WARN com.zaxxer.hikari.pool.PoolBase - HikariPool-1 - Failed to validate connection com.mysql.jdbc.JDBC4Connection@7024d7c3 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.
com.zaxxer.hikari.pool.PoolBase 类
CannotGetJdbcConnectionException
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
### The error may exist in com/common/mapper/BaseAccountInfoMapper.java (best guess)
### The error may involve com.common.mapper.BaseAccountInfoMapper.queryUserIdByAccountId
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:79) ~[mybatis-spring-1.3.0.jar!/:1.3.0]
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447) ~[mybatis-spring-1.3.0.jar!/:1.3.0]
at com.sun.proxy.$Proxy130.selectOne(Unknown Source) ~[?:?]
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:167) ~[mybatis-spring-1.3.0.jar!/:1.3.0]
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75) ~[mybatis-3.4.0.jar!/:3.4.0]
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) ~[mybatis-3.4.0.jar!/:3.4.0]
at com.sun.proxy.$Proxy137.queryUserIdByAccountId(Unknown Source) ~[?:?]
原因是 hikari 连接池中连接都已被占用,获取不到可用的 jdbc 连接,等待一段时间后超时。
上一篇 Vue
下一篇 Raft分布式一致性算法
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: