HikariCP不断打印WARN日志Failed to validate connection com.mysql.jdbc.JDBC4Connection@xxxxx (...) Possibly consider using a shorter maxLifetime value.
最终解决方案(结论)
maxLifeTime参数需要设置为小于min(数据库的wait_timeout,HA代理的超时时间,其他代理的超时时间);也就是说maxLifeTime不仅要像HikariCP官方说的那样小于数据库的wait_timeout,还要小于包括HA代理在内的所有介于数据库和业务应用之间其他代理的超时时间。
起因
之前项目中用的都是c3p0的一些连接池,但是根据公司的提供,改为使用HikariCP连接池。但是在项目运行过程中发现项目总是过一段时间就打印日志:
解决过程
经过排查和观看源代码,可以发现这个日志实际上并不会导致业务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.的更多相关文章
- Procedure execution failed 2013 - Lost connection to MySQL server during query
1 错误描述 Procedure execution failed 2013 - Lost connection to MySQL server during query 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 ...
- 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. ...
- 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 ...
- Selenium WebDriver Log4j打印执行日志
在自动化测试脚本的执行过程中,使用log4j在日志文件中打印执行日志,用于监控和后续调试脚本. Log4j.xml 文件 <log4j:configuration xmlns:log4j=&qu ...
- 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 ...
- log4j+mybatis打印数据库日志
参考文献:一:http://blog.csdn.net/rangqiwei/article/details/50825090 二:http://www.mybatis.org/mybatis-3/zh ...
- npm不能安装任何包,报错:npm WARN onload-script failed to require onload script npm-autoinit/autoinit及解决方法
想要利用Hexo搭建一个博客,但是安装时npm一直报错,不仅仅是Hexo包,连别的其他包也不行,会提示下面的一堆错误 npm WARN onload-script failed to require ...
- Spring Boot 2.0 教程 | AOP 切面统一打印请求日志
欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...
- IDEA打印gc日志,设置JVM参数方法
打印gc日志 1.对指定运行程序输出GC日志: 点击edit configurations... 在vm options处加入-XX:+PrintGCDetails 测试:代码调用system.gc后 ...
随机推荐
- Linux内存管理2.6 -反向映射RMAP(最终版本)
所谓反向映射是相对于从虚拟地址到物理地址的映射,反向映射是从物理页面到虚拟地址空间VMA的反向映射. RMAP能否实现的基础是通过struct anon_vma.struct anon_vma_cha ...
- MobileNet V2中InvertedResidual实现
1.为了方便理解其本身结构,找到源码理解一下. 2.论文地址:http://arxiv.org/pdf/1801.04381.pdf 3.V2相比较V1增加了倒残差结构和线性瓶颈层.整个结构按照维度来 ...
- Java日期时间API系列40-----中文语句中的时间语义识别(time NLP)代码实现分析
从上篇 Java日期时间API系列39-----中文语句中的时间语义识别(time NLP 输入一句话,能识别出话里的时间)原理分析 中得知解析的主要步骤分为三步: (1)加载正则文件 (2)解析中文 ...
- Java日期时间API系列25-----Jdk8中java.time包中的新的日期时间API类,使用MonthDay计算十二星座。
通过Java日期时间API系列24-----Jdk8中java.time包中的新的日期时间API类,MonthDay类源码和应用,对比相同月日时间.对MonthDay简单做了说明和应用.十二星座是根据 ...
- 玩玩虚拟化-KVM
1.讲在前面(玩这个的心历路程) 最近一段时间想玩一些集群之类的东西,学习搞一下K8s,集群啥的,但是我没有多台服务器,如果购买云服务器成本太高,后来想到了买台台式机弄点虚拟机来玩,于是我就在某鱼上淘 ...
- JDBC 和 Mybatis
使用JDBC连接操作数据库 Mybatis是JDBC的二次封装 使用更加简单了
- 2024Ciscn总决赛Web Writeup
前言 鸽了三个月的复现计划:) ezjs 考点是express引擎解析的一个trick,在高版本的express已经修复,先贴源码 const express = require('express') ...
- C++处理系统相关权限问题
1.给某个文件或文件夹赋予特定用户的特定访问权限 /* 给文件(夹)szPath设置用户名为pszAccount的可读可写可修改权限 */ bool GiveTheAccountPrivToFile( ...
- 如何使用强化学习算法解决贪吃蛇问题(Neural Network Learns to Play Snake)
相关: Neural Network Learns to Play Snake https://github.com/greerviau/SnakeAI/ RL算法是有很多baseline算法的,算法 ...
- 干货分享:开启PWM调光之门,一起来做呼吸灯
PWM作为一种灵活且高效的信号调制手段,在电气设备的性能控制和调节中发挥着重要作用,常用于电机控制.灯光调光.音频信号生成.加热控制等应用. 本文将以合宙低功耗4G模组经典型号--Air780E为例, ...