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后 ...
随机推荐
- OpenCL架构
OpenCL提供了一种统一的编程接口,使得程序员可以编写一次代码,然后在多种处理器上运行. 平台模型 OpenCL平台总是包括一个宿主机(host).宿主机与OpenCL程序外部的环境交互,包括I/O ...
- C++ 第三节课 指针的使用
#include <iostream> using namespace std; void show(){ cout << "全局函数" << ...
- 04-react的基本:条件渲染
import reactDom from "react-dom" // 条件渲染 if else let loading = false // 写一个函数用于加载 const lo ...
- kotlin协程——>协程上下文与调度器
协程上下⽂与调度器 协程总是运⾏在⼀些以 CoroutineContext 类型为代表的上下⽂中,它们被定义在了 Kotlin 的标准库 ⾥. 协程上下⽂是各种不同元素的集合.其中主元素是协程中的 J ...
- 一、java的简单介绍
Java语言 Java是一门面向对象的程序设计语言,在语法上Java与C和C++类似,但丢弃了其相对难理解的一些特性,如操作符重载.多继承.自动的强制类型转换,同时Java语言不使用指针,而是引用,并 ...
- KubeSphere 3.1.1 发布,可以接入集群已有的 Prometheus
KubeSphere 作为一款面向应用的开源容器平台,经过 3 年的发展和 10 个版本的迭代,收获了两百多位开源贡献者,超过十万次下载,并有数千名社区用户用 KubeSphere 作为企业容器平台. ...
- NIO和传统IO
传统 IO 基于字节流或字符流(如 FileInputStream.BufferedReader 等)进行文件读写,以及使用 Socket 和 ServerSocket 进行网络传输. NIO 使用通 ...
- spring下 -spring整体架构,JdbcTemplate笔记
2,搭建Java Maven项目 我的idea是2024.1.1版本,创建普通Maven项目如下图: 用的jdk8,项目名可以自己改,Archetype选图中的第一个就行,之后点 create. 创建 ...
- 如果让你处理hbase 怎么保证数据的安全性可靠性 不需要具体的设置 要一套方案
有关数据安全及可靠我们认为大体上分为存储安全和使用安全 1 数据存储安全 hbase是基于hdfs的一种数据存储解决方案,所以有关数据的安全性可靠性可以利用hdfs自身的副本机制保障.另外原生的hba ...
- [python]Gunicorn加持,轻松提升Flask超7倍性能
前言 之前学习和实际生产环境的flask都是用app.run()的默认方式启动的,因为只是公司内部服务,请求量不高,一直也没出过什么性能问题.最近接管其它小组的服务时,发现他们的服务使用Gunicor ...