druid Communications link failure报错处理

2024-01-03 14:36

本文主要是介绍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等

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

这篇关于druid Communications link failure报错处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/566018

相关文章

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos