HikariCP连接池8小时后只有一个连接或session问题

发布于:2023-01-09 ⋅ 阅读:(545) ⋅ 点赞:(0)

项目中的一个批处理程序,需要长时间与数据库保持连接,属于典型的“写多读少”场景。监控的结果发现程序前8小时性能很好,之后就开始衰减。

用 show full process list 检查数据库连接情况发现:

        网上查询后发现与HikariCP的配置参数有关,有几个参数配置不对,其中最关键的maxLifetime参数没有配置,当然保险起见keep-alive也一起配置最好。以下内容是从网上的一篇文章中摘抄下来的,原文链接为(CSDN博主「elegent Developer」的原创文章):1. HikariCP连接池优化配置小结_elegent Developer的博客-CSDN博客_hikaricp配置优化 

以下为摘录的有参考价值的内容:

频繁使用的属性(Frequently used)
1. autoCommit
这个属性控制连接返回池中前auto-commit是否自动进行。缺省:true。
最佳实践:不需要配置,保持缺省即可。

2. connectionTimeout
控制一个客户端等待从池中获取连接的最大时间。超过该时间还获取不到连接则抛出SQLException,最低可设置的时间是250ms,缺省:30000ms

最佳实践:非特殊业务场景保持缺省30s连接超时即可。

3. idleTimeout
控制空闲连接的在池中最大的空闲时间。注意:这个配置只有当配置了minimumIdle属性(表示允许的最小空闲连接数),且比maximumPoolSize(表示池中允许的最大连接数)更小时才生效。 这个比较好理解:当前池中有空闲连接且比允许的最小空闲连接多时,根据空闲超时时间来逐出。

Spring Boot如何使用HikariCP连接池详解
pdf

0星
超过10%的资源
56KB

下载
当配置为0时表示空闲连接永远不逐出。
缺省:600000ms
最小生效值:10000ms

连接池会定时轮询检测哪些连接是空闲,并且空闲达到了idleTimeout配置的时间,但轮询间隔有时间差,一个空闲连接最大可空闲idleTimeout + 30s会逐出,平均是:idleTimeout + 15s。

最佳实践:不设置该属性和minimumIdle属性,保持连接池固定的连接

4. keepaliveTime
用于跟数据库保持心跳连接,防止底层网络基础设施超时断开,定期验证连接的有效性。这个参数需要设置的比maxLifetime(连接最大生存时间,下文会介绍)小。只会对池中空闲连接发生keeplive,具体执行细节是:
从池中取出一个连接,执行“ping”,成功后再放回。
ping:
如果当前支持JDBC4 , 通过调用isValid()方法实现
否则执行connectionTestQuery属性(下文会介绍)指定的sql

这个参数配置后连接池会定期检测连接有效性,检测过程中连接短暂从池中移出,不过不用担心,耗时非常短(几ms甚至更短)

缺省:0, 即不开启
最小可配置:30000ms ,即30秒

最佳实践: 需要设置, 可设置为60000, 即1分钟心跳一次

5. maxLifetime
该属性用于控制连接在池中的最大生存时间,超过该时间强制逐出,连接池向数据申请新的连接进行补充。注意:当前正在使用的连接不会强制逐出,哪怕它的累计时间已经到了maxLifetime。

强烈建议设置该属性,可设置的比数据库或网络基础设施允许的最大连接时间小一些。 如数据库连接最大失效时间是8小时,可设置为4小时。

缺省:1800000, 即30min
最小可配置:30000,即30s

最佳实践:需要设置,根据数据库或网络基础设施的情况,比它们小一些

7. connectionTestQuery
如果当前连接驱动支持JDBC4, 强烈不建议设置此属性。因为该属性的设置是为了支持keepalive检测,只有当JDBC4的isValid不可用时才使用connectionTestQuery配置的sql进行检测;或者当从池中获取连接时检测连接是否有效

缺省:none

常用四大连接池集合
rar

0星
超过10%的资源
6.03MB

下载
最佳实践:驱动支持JDBC4不需要设置,反之需要配置,MYSQL: select 1; Oracle: select 1 from dual

8. minimumIdle
配置连接池最小空闲连接数。为了性能最优化和为了应对高峰请求的快速响应强烈不建议设置该属性,让HikariCP连接池保持固定大小。
缺省:跟maximumPoolSize相同

最佳实践:保持缺省,让连接池固定大小,避免扩缩容带来的性能影响

9. maximumPoolSize
配置允许连接池达到的最大连接数(包括空闲和正在使用的),当池中连接达到maximumPoolSize,且都不空闲,当有新请求从池中申请连接池会阻塞等待可用连接,达到connectionTimeout还不能申请成功,则抛出SQLException。

缺省:10

最佳实践:根据实际环境配置,通常设置为核心数的2倍较优

10. metricRegistry
配置该属性,能让连接池将度量信息收集起来供分析。配置的属性是Codahale/Dropwizard的实例,具体可参考wiki页面:https://github.com/brettwooldridge/HikariCP/wiki/Dropwizard-Metrics

11. healthCheckRegistry
同样是收集信息用,这个属性收集的是连接池的健康状况。配置的属性是Codahale/Dropwizard的实例,具体可参考wiki页面:https://github.com/brettwooldridge/HikariCP/wiki/Dropwizard-HealthChecks

最佳的配置总结如下(配用户名称、密码就不用提了):