最终解决方案(结论)

maxLifeTime参数需要设置为小于min(数据库的wait_timeout,HA代理的超时时间,其他代理的超时时间);也就是说maxLifeTime不仅要像HikariCP官方说的那样小于数据库的wait_timeout,还要小于包括HA代理在内的所有介于数据库和业务应用之间其他代理的超时时间。

起因

之前项目中用的都是c3p0的一些连接池,但是根据公司的提供,改为使用HikariCP连接池。但是在项目运行过程中发现项目总是过一段时间就打印日志:

Failed to validate connection com.mysql.jdbc.JDBC4Connection@xxxxx (...)Possibly consider using a shorter maxLifetime value.

解决过程

经过排查和观看源代码,可以发现这个日志实际上并不会导致业务SQL语句的执行出现问题,但是终究还是对语句的执行速度有影响,通过抛出异常再重新获取有效连接肯定是比直接获取有效连接是要慢的。所以在有一些需求之间的空闲时间的情况下,还是打算排查一下这个问题。

按照HikariCP官方和日志中的建议来看,应该是maxLifeTime设置的过长了,所以在询问过DBA之后,得知数据库的wait_timeout设置的是500秒,所以将maxLifeTime连接设置为450_000毫秒,但是仍然还是会打印这种日志,所以这是不行的。

接下来我在网上搜,发现各种的解决都有,大部分都是通过设置更短的时间解决的,但是很少有说为什么设置的这么短就可以解决,而且每个人的数据库配置都是不一样的,所以实际上没什么借鉴意义。那么还是要自己分析一下,可以确定的是出现问题的就是maxLifeTime这个参数。那么这个参数的作用是什么?通过阅读部分HikariCP的源码和对于网上说法的理解来说,maxLifeTime就是用于设置连接在连接池中生存的最大时间的,这个参数一般要比数据库持有连接的时间要短。这是很好理解的,如果数据库主动断开连接,那么底层意义上,连接就已经失效了,一定是会打印这个日志的。但是我明明已经将maxLifeTime设置的比数据库的wait_timeout要短了,然后我一度以为是不是DBA给了错误的timeout时间,向DBA确认之后发现不行。也就是说数据库并不会在maxLifeTime的时间内断开连接。

然后我在搜索的时候发现有一个结果是导向了GitHub的,我想到这个问题应该是很常见的,而且GitHub上作者也会那么我就到GitHub上HikariCP 的issue里面进行搜索,发现了这么一个issue,这个issue也有作者在里面回答,作者的回答主要是检查mysql的连接时间和是否有获取并自行关闭了底层的connection。这种情况在我这里都是没有的。然后有一个人紧跟着作者说是否是HA代理超时了,然后我就想到我们的数据库是有用到HA代理的,而且服务如果是通过HA代理连接数据库的话,那么maxLifeTime一定是设置为比数据库超时时间和HA代理超时时间中最小的那一个还要小。然后向DBA询问HA代理的超时时间,说是300秒,后续我将maxLifeTime改为290_000毫秒之后,发现不再打印错误日志了,至此问题解决

可以很容易想到的是,如果服务与数据库之间还隔了其他的服务或者代理的话,那么maxLifeTime也是取决于这些中间服务和数据库中最小的那个超时时间的,但是maxLifeTime最小只能到30秒。

HikariCP不断打印WARN日志Failed to validate connection com.mysql.jdbc.JDBC4Connection@xxxxx (...) Possibly consider using a shorter maxLifetime value.的更多相关文章

  1. Procedure execution failed 2013 - Lost connection to MySQL server during query

    1 错误描述 Procedure execution failed 2013 - Lost connection to MySQL server during query 2 错误原因 由错误描述可知 ...

  2. [Firmware Warn]: GHES: Failed to read error status block address for hardware error source

    Firmware Warn 问题描述: 系统版本:Ubuntu 12.04 LTS. 系统启动后dmesg打印大量Firmware Warn告警信息到syslog文件中.信息如下: [Firmware ...

  3. CDH报错:ScmActive at bootup: Failed to validate the identity of Cloudera Manager.

    报错原因以及解决办法在官网: https://www.cloudera.com/documentation/enterprise/5-8-x/topics/cm_failover_db.html 1. ...

  4. dubbo服务provider方打印警告日志,getDeserializer - Hessian/Burla 'xxx' is an unknown class

    2018-09-12 16:16:44 WARN [New I/O worker #1] SerializerFactory.java:652 getDeserializer - Hessian/Bu ...

  5. Selenium WebDriver Log4j打印执行日志

    在自动化测试脚本的执行过程中,使用log4j在日志文件中打印执行日志,用于监控和后续调试脚本. Log4j.xml 文件 <log4j:configuration xmlns:log4j=&qu ...

  6. Druid 1.1.24 在控制台打印"discard long time none received connection. , jdbcUrl : jdbc:mysql://...."错误日志

    Druid 1.1.24 在控制台打印"discard long time none received connection. , jdbcUrl : jdbc:mysql://...&qu ...

  7. log4j+mybatis打印数据库日志

    参考文献:一:http://blog.csdn.net/rangqiwei/article/details/50825090 二:http://www.mybatis.org/mybatis-3/zh ...

  8. npm不能安装任何包,报错:npm WARN onload-script failed to require onload script npm-autoinit/autoinit及解决方法

    想要利用Hexo搭建一个博客,但是安装时npm一直报错,不仅仅是Hexo包,连别的其他包也不行,会提示下面的一堆错误 npm WARN onload-script failed to require ...

  9. Spring Boot 2.0 教程 | AOP 切面统一打印请求日志

    欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...

  10. IDEA打印gc日志,设置JVM参数方法

    打印gc日志 1.对指定运行程序输出GC日志: 点击edit configurations... 在vm options处加入-XX:+PrintGCDetails 测试:代码调用system.gc后 ...

随机推荐

  1. 一些git使用命令,误删本地分支,如何找回

    1.新建仓库 git init 2.如果要本地更改文件,需要更新到远端. git status # 查看当前文件状态 git add -A # "git add -A" 命令用于将 ...

  2. 数据库运维实操优质文章分享(含Oracle、MySQL等) | 2023年5月刊

    本文为大家整理了墨天轮数据社区2023年5月发布的优质技术文章,主题涵盖Oracle.MySQL.PostgreSQL等数据库的安装配置.故障处理.性能优化等日常实践操作,以及常用脚本.注意事项等总结 ...

  3. Solon 3.0 新特性:SqlUtils

    Solon 3.0 引入了新的 SqlUtils 用于数据库基础操作,SqlUtils 是对 JDBC 较为原始的封装,采用了 Utils API 的风格,极为反普归真. 特性有: 支持事务管理 支持 ...

  4. 11 Self-Attention相比较 RNN和LSTM的优缺点

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  5. 你为什么不应该过度关注go语言的逃逸分析

    逃逸分析算是go语言的特色之一,编译器自动分析变量/内存应该分配在栈上还是堆上,程序员不需要主动关心这些事情,保证了内存安全的同时也减轻了程序员的负担. 然而这个"减轻负担"的特性 ...

  6. 想玩Steam游戏,但配置太低?ToDesk云电脑一招搞定!

    在游戏爱好者的世界里,汇集了许多游戏大作的Steam平台无疑是一座宝库.但对于许多玩家来说,拥有一颗渴望畅玩游戏的心,却常常被低配置的电脑设备所束缚.尤其是面对硬件要求极高的3A大作时,低配置的电脑往 ...

  7. 一文彻底弄懂MySQL的各个存储引擎,InnoDB、MyISAM、Memory、CSV、Archive、Merge、Federated、NDB

    MySQL 中的存储引擎是其数据库管理系统的核心模块,用于处理不同类型的数据存储和检索操作.每种存储引擎都有自己的特点,适用于不同类型的应用场景.MySQL 最常用的存储引擎包括 InnoDB.MyI ...

  8. 【总结】线性dp的几种重要模型

    当前点定义 \(f[i]\) :走到第 \(i\) 个点的方案数 / 最值. \(f[i][j]\) :走到第 \(i\) 个点,选了 \(j\) 个的答案. 依据题目的限制个数可以继续添加维数,也可 ...

  9. NOIP2024模拟11:忠于自我

    NOIP2024模拟11:忠于自我 T1 一句话题意:有若干个容量为 \(L\) 的包,从左往右装物品,当前包还能装则装,否则必须重开一个包装进去,对于\(\forall i \in [1,n]\), ...

  10. Git Flow开发分支管理

    Git Flow Git Flow 是一种基于 Git 版本控制系统的分支管理模型,定义了一套严格的分支命名和操作规范 主要包括以下几种分支类型: 主干分支(master):始终保持稳定,只包含经过充 ...