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后 ...
随机推荐
- Python | os.path.join() method
Python中的os.path.join()方法可以连接一个或多个路径组件. 此方法将各个路径组成部分,与每个非空部分路径组成部分恰好用一个目录分隔符(" /")连接起来. 如果要 ...
- vue2基于 vue-cropper插件对图片裁剪
<template> <div id="app"> <div class="model" v-show="model&q ...
- C#通过JS变量提取天天基金API返回的基金净值
目录 天天基金API 添加项目依赖项 请求 API 数据 获取所有基金代码 获取基金净值信息 功能测试 参考链接 天天基金API 常见的 API 如下: 所有基金代码:http://fund.east ...
- 基于 KubeKey 扩容 Kubernetes v1.24 Worker 节点实战
前言 知识点 定级:入门级 KubeKey 扩容 Worker 节点 openEuler 操作系统的基本配置 Kubernets 基本命令 实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不 ...
- Paimon lookup store 实现
Lookup Store 主要用于 Paimon 中的 Lookup Compaction 以及 Lookup join 的场景. 会将远程的列存文件在本地转化为 KV 查找的格式. Hash htt ...
- React h5架构
目录 目录 初始化项目架构 React h5架构 工具 技术栈 搭建流程 一.Vite构建项目 二.添加 git 三.运行项目 四.配置 Eslint 校验代码 五.配置 Prettier 格式化代码 ...
- DDCA —— 内存架构和子系统&存储器控制器
1. 内存架构和子系统 1.1 如何控制访问? 访问控制: 存储单元的访问是通过 访问晶体管(access transistors) 进行控制的.访问晶体管像开关一样,可以连接或断开存储单元和位线(b ...
- cmu15545笔记-查询执行(Query Excution)
目录 执行模型 Iterator Model Materialization Model Vectoriazation Model 对比 数据访问方式 Sequential Scan Index Sc ...
- 2.TP6的入门-分页类的改写
看了看推荐的分页类的使用,还是很简单的,可是自己去尝试改写生成的分页类结构就会很麻烦,总是不成功,后来发现手册里面还有这个 就说你想重写分页类,就需要这样做 赶紧实践了一下,先改这里的provider ...
- (Python基础教程之十四)Python将tuple开箱为变量或参数
Python示例将N元素元组或序列开箱缩为N个变量的集合.将元组开箱缩为变量的 Python示例. 1. Python开箱元组示例 可以使用简单的赋值操作将任何序列(或可迭代)开箱缩为变量.唯一的要求 ...