连接池
我们常用的连接池,一般是Hikari连接池。
背景
问题如下:
nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database.
Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection;
nested exception is java.sql.SQLTransientConnectionException: 76d843a4-94ba-47dc-9334-e9fefbfdd1a9_pcm - Connection is not available, request timed out after 30042ms.
### The error may exist in URL [jar:file:/opt/Pcm/pcm-server-manage.jar!/BOOT-INF/lib/pcm-module-main-biz-2.3.0.jar!/mapper/ProjectStatusReportPOMapper.xml]
### The error may involve com.jshxhb.module.main.biz.mapper.ProjectStatusReportPOMapper.selectByExample
### The error occurred while executing a query ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException:
Failed to obtain JDBC Connection; nested exception is java.sql.SQLTransientConnectionException:
76d843a4-94ba-47dc-9334-e9fefbfdd1a9_pcm - Connection is not available, request timed out after 30042ms.
可以看到,报错信息显示:Connection is not available, request timed out after 30042ms.
下面,我们基于这个连接超时的报错,开始进入Hikari 连接池的领域。
连接的各步骤 及 对应的配置参数
下面,我们看下,配置参数,是怎么来的?以及默认值是多少?
配置参数,主要来自于HikariConfig
这个类,默认值,也是在这个类中定义的,如下:
可以看到,在这里定义了很多常量,这些常量,都是连接的配置参数的默认值
connectionTimeout:等待时间,客户端从连接池中,获取可用的connection的等待时间。 如果没有可用连接的情况下,等待时间超过此时间,则会抛出SQLException,Connection is not available, request timed out after 30042ms.
定时任务
在HikariPool
中,有3个定时任务:
com.zaxxer.hikari.pool.HikariPool.HouseKeeper
com.zaxxer.hikari.pool.HikariPool.MaxLifetimeTask
com.zaxxer.hikari.pool.HikariPool.KeepaliveTask
其中,HouseKeeper的作用,是保证连接数,维持在minIdle 和 max-pool-size之间
MaxLifetimeTask的作用,是保证连接,不会超过保质日期
KeepaliveTask的作用,是对连接,进行探活,防止连接被mysql关闭了,但是客户端还以为连接是可用的。
Best Practise
{"connectionTimeout":30000,"maxLifetime":1800000,"keepaliveTime":180000,"maxPoolSize":5,"minIdle":3}
参考资料
配置参数,如下:
https://www.cnblogs.com/newAndHui/p/13723250.html
https://www.modb.pro/db/215198
连接保活 & 探活,如下:
https://ayonel.github.io/2020/08/18/hikari-keeplive/
https://blog.csdn.net/m0_46485771/article/details/118583714
https://developer.jdcloud.com/article/3257
hikari连接的归还:
https://blog.csdn.net/Shang_q_f/article/details/119302075
为HikariCP配置MetricRegistry监控:
https://www.codeleading.com/article/13236300745/#google_vignette
https://blog.csdn.net/abu935009066/article/details/127155653
org.springframework.boot.actuate.autoconfigure.metrics.jdbc.DataSourcePoolMetricsAutoConfiguration.HikariDataSourceMetricsConfiguration
MicrometerMetricsTracker