druid Communications link failure报错处理

现象

日志报错:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

原因

从数据库连接池拿到了已经关闭的连接,导致报错。druid有定时任务进行空闲连接的检测和回收,当连接时长超过mysql的连接超时时间时,会被mysql强制断开,而如果此时数据库连接池并没有检测到连接已断开并交给应用去使用就会导致报错。

1、查看mysql服务器端的连接超时时间,单位秒,默认时8小时

show global variables like 'wait_timeout'

show global variables like 'interactive_timeout'

druid的关键参数详解

minIdle: 最小连接池数量

minEvictableIdleTimeMillis: 单位毫秒,默认30分钟,如果连接池中空闲连接大于minIdle数量,且连接空闲时间超过该值,则进行连接的回收操作。

maxEvictableIdleTimeMillis: 单位毫秒,默认7小时,如果连接空闲时间超过该值则强制关闭。

timeBetweenEvictionRunsMillis: 单位毫秒,两个作用:

1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接,连接时在取一条活跃的连接。

2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明

testWhileIdle:默认值为false。 建议配置为true, 不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。

validationQuery: 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用

解决方案

当以上参数配置不合理时,一般人错误原因应该是3

1)minEvictableIdleTimeMillis过大 空闲连接一直没有被回收,而超过mysql连接超时时间被强制回收后,则此时获取到的连接会导致报错。

2)timeBetweenEvictionRunsMillis配置过大,则在该时间窗口内获取到的连接可能报错。

3)maxEvictableIdleTimeMillis在某种情况下7小时未自动回收,导致8小时后数据库自动断开,建议改成3小时或更小。timeBetweenEvictionRunsMillis改成10000以便10秒检查一遍,testWhileIdle设置true 

验证:

数据库超时时间设为30s

set global wait_timeout=30;

1, test-while-idle 为false情况

条件:minEvictableIdleTimeMillis和maxEvictableIdleTimeMillis设置的足够大,test-while-idle设置为false

分析:执行第一次请求建立数据库连接,等待30s后执行第二次请求,此时连接已被数据库断开,因为连接池minEvictableIdleTimeMillis足够大,所以不会关闭空闲连接,且test-while-idle为false不会在请求时检测连接,所以预期会报错

      maxActive: 20   
      initialSize: 1      
      minIdle: 1       
      maxWait: 60000   
      time-between-eviction-runs-millis: 40000
      minEvictableIdleTimeMillis: 1800000
      maxEvictableIdleTimeMillis: 2400000
      validationQuery: SELECT 1
      test-while-idle: false  
      test-on-borrow: false 
      test-on-return: false 
 

 

2, test-while-idle true,time-between-eviction-runs-millis<30

条件:minEvictableIdleTimeMillis和maxEvictableIdleTimeMillis设置的足够大;

test-while-idle设置为true,time-between-eviction-runs-millis<30s

分析:执行第一次请求建立数据库连接,等待30s后执行第二次请求,此时连接已被数据库断开,因为连接池minEvictableIdleTimeMillis足够大,所以不会关闭空闲连接,test-while-idle为true会检测空闲超过time-between-eviction-runs-millis的连接,且time-between-eviction-runs-millis<30s, 等待30秒后进行第二次请求时会执行连接有效性检测抛弃无效连接,所以总是能拿到有效连接,不会报错。

      maxActive: 20   
      initialSize: 1      
      minIdle: 1       
      maxWait: 60000   
      time-between-eviction-runs-millis: 20000
      minEvictableIdleTimeMillis: 1800000
      maxEvictableIdleTimeMillis: 2400000
      validationQuery: SELECT 1
      test-while-idle: true  

可以看到第二次请求druid新建了一条连接而不是使用连接池已有的连接。

3,test-while-idle true,time-between-eviction-runs-millis>30

条件:minEvictableIdleTimeMillis和maxEvictableIdleTimeMillis设置的足够大;

test-while-idle设置为true,time-between-eviction-runs-millis>30s

分析:执行第一次请求建立数据库连接,等待30s以后执行第二次请求,此时连接已被数据库断开,因为连接池minEvictableIdleTimeMillis足够大,所以不会关闭空闲连接,test-while-idle为true会检测空闲超过time-between-eviction-runs-millis的连接,且time-between-eviction-runs-millis>30s, 分以下两种情况

      maxActive: 20   
      initialSize: 1      
      minIdle: 1       
      maxWait: 60000   
      time-between-eviction-runs-millis: 40000
      minEvictableIdleTimeMillis: 1800000
      maxEvictableIdleTimeMillis: 2400000
      validationQuery: SELECT 1
      test-while-idle: true  

1)等待30秒且小于40秒,由于此时空闲时间<time-between-eviction-runs-millis ,所以获取连接时不会执行有效性质检测,所以依然会报错

2)等待40秒后进行第二次请求时会执行连接有效性检测抛弃无效连接,所以总是能拿到有效连接,不会报错。

4,test-while-idle false,

minEvictableIdleTimeMillis设置为40,minIdle设置为0

      maxActive: 20   
      initialSize: 1      
      minIdle: 0       
      maxWait: 60000   
      time-between-eviction-runs-millis: 1000
      minEvictableIdleTimeMillis: 40000
      maxEvictableIdleTimeMillis: 2400000
      validationQuery: SELECT 1
      test-while-idle: true  

1)等待40秒执行第二次请求操作,则满足如果连接池中空闲连接大于minIdle数量,且连接空闲时间超过该值,则进行连接的回收操作,预期不会报错。

2)等待35秒执行第二次请求,则不满足空闲时间大于40秒,预期会报错

 5,其他情况:长事务,time-between-eviction-runs-millis过大,minEvictableIdleTimeMillis和maxEvictableIdleTimeMillis大于wait_timeout等

------------------------------------------与正文内容无关------------------------------------
如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!小弟在这拜谢了!
如果您觉得我的文章在某些地方写的不尽人意或者写的不对,从而让你对你人生观产生颠覆(概不负责),需要斧正,麻烦在评论区不吝赐教,作者看到后会根据您的提示查阅文章进行修改,还这世间一个公理一片蓝天

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/327534.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8改进 | 2023主干篇 | FasterNeT跑起来的主干网络( 提高FPS和检测效率)

一、本文介绍 本文给大家带来的改进机制是FasterNet网络,将其用来替换我们的特征提取网络,其旨在提高计算速度而不牺牲准确性,特别是在视觉任务中。它通过一种称为部分卷积(PConv)的新技术来减少冗余计算和内存访问。这种方法使得FasterNet在多种设备上运行速度比其他网络…

【Flink精讲】Flink数据延迟处理

面试题&#xff1a;Flink数据延迟怎么处理&#xff1f; 将迟到数据直接丢弃【默认方案】将迟到数据收集起来另外处理&#xff08;旁路输出&#xff09;重新激活已经关闭的窗口并重新计算以修正结果&#xff08;Lateness&#xff09; Flink数据延迟处理方案 用一个案例说明三…

C# Attribute特性实战(1):Swtich判断优化

文章目录 前言简单Switch问题无参Swtich方法声明Swtich Attribute声明带有Swtich特性方法主方法结果 有参Switch修改代码修改运行过程运行结果 总结 前言 在经过前面两章内容的讲解&#xff0c;我们已经简单了解了如何使用特性和反射。我们这里解决一个简单的案例 C#高级语法 …

摄像头视频录制程序使用教程(Win10)

摄像头视频录制程序-Win10 &#x1f957;介绍&#x1f35b;使用说明&#x1f6a9;config.json 说明&#x1f6a9;启动&#x1f6a9;关闭&#x1f6a9;什么时候开始录制&#xff1f;&#x1f6a9;什么时候触发录制&#xff1f;&#x1f6a9;调参 &#x1f957;介绍 检测画面变化…

前端Web系统架构设计

文章目录 1.目录结构定义2. 路由封装2.1 API路由定义2.2 组件路由定义 3. Axios请求开发4. 环境变量封装5. storage模块封装(sessionStorage, localStorage)6. 公共函数封装(日期,金额,权限..)7. 通用交互定义(删除二次确认,类别,面包屑...)8. 接口全貌概览 1.目录结构定义 2. …

30、共空间模式CSP与白化矩阵

CSP算法和PCA降维都涉及到了白化&#xff0c;那白化的目的和作用到底是啥呢&#xff1f; 矩阵白化目的&#xff1a; 对于任意一个矩阵X&#xff0c;对其求协方差&#xff0c;得到的协方差矩阵cov(X)并不一定是一个单位阵。 下面介绍几个线代矩阵的几个概念&#xff1a; 1、…

计算机网络——OSI参考模型

1. OSI模型的基本概念 1.1 定义 OSI&#xff08;开放式系统互联&#xff09;模型是一个用于理解和标准化电信系统或计算机网络功能的概念性的框架&#xff0c;用于描述和标准化不同计算机系统或网络设备间通信的功能。 1.2 OSI模型的性质 这个模型由国际标准化组织&#xff08…

CMake入门教程【核心篇】定义C++宏定义(add_compile_definitions)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.基本用法2.定义单个宏3.定义多个宏4.条件定义宏5.使用预定义变量6.使用 generator 表达式

7款实用的SQLite数据库可视化管理工具

前言 俗话说得好“工欲善其事&#xff0c;必先利其器”&#xff0c;合理的选择和使用可视化的管理工具可以降低技术入门和使用门槛。今天推荐7款实用的SQLite数据库可视化管理工具(GUI)&#xff0c;帮助大家更好的管理SQLite数据库。 什么是SQLite&#xff1f; SQLite是一个…

每日一题——LeetCode1089.复写0

方法一 splice&#xff1a; 通过数组的slice方法&#xff0c;碰到 0就在后面加一个0&#xff0c;最后截取原数组的长度&#xff0c;舍弃后面部分。 但这样做是违反了题目的要求&#xff0c;不要在超过该数组长度的位置写入元素。 var duplicateZeros function(arr) {var le…

超简单的详细教程:如何为一个GitHub开源项目做出贡献!

仓库&#xff1a;Ai-trainee/GPT-Prompts-Hub 让我们通过一个具体的例子&#xff0c;详细了解如何从克隆一个GitHub仓库开始&#xff0c;一步步地贡献到一个项目。以下是详细步骤&#xff0c;包括所需的代码和说明&#xff1a; 首先我们Fork想要贡献的项目&#xff0c;然后请看…

网络安全红队常用的攻击方法及路径

一、信息收集 收集的内容包括目标系统的组织架构、IT资产、敏感信息泄露、供应商信息等各个方面&#xff0c;通过对收集的信息进行梳理&#xff0c;定位到安全薄弱点&#xff0c;从而实施下一步的攻击行为。 域名收集 1.备案查询 天眼查爱企查官方ICP备案查询 通过以上三个…