The last packet successfully received from the server was 1,266,537 milliseconds ago. The last pack

由于数据库连接池的原因,造成CommunicationsException: Communications link failure,遇到这样的坑,记录下来 一、先上日志报错 日志报错太长,就截图了能找到错误的原因,关键在这句:The last packet successfully received from the server was 1,996,637 milliseconds ago. The last packet sent successfully to the server was 1 milliseconds ago. 二、问... 阅读详情

最近接手一个项目,由于该项目对mysql数据库使用频率不是很高,线上每天都会报几十条数据库连接失效的错误信息,刚开始没空处理这个错误,连接失效超时后会继续建立有效连接,不会影响正常的业务。今天抽空处理下这个错误,简单做下总结:

1、线上错误的日志信息如下:

2019-02-23 09:49:35:872 d.s.Statement 149 [ERROR] {conn-10345, stmt-42475} execute error. SELECT 'x'
 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 1,266,528 milliseconds ago.  The last packet sent successfully to the server was 1,266,529 milliseconds ago.
    at sun.reflect.GeneratedConstructorAccessor69.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:981)
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3652)

2、错误分析

      分析该错误是由于业务系统使用了过期的数据库连接导致请求超时,和dba确认线上mysql数据库wait_timeout配置的3600s(1小时)、业务线程闲置状态下和数据库保持的连接存活1个小时后数据库主动断开连接,这个时候有新的数据库操作请求、拿到该连接去执行validationQuery检测连接是否有效,由于数据库已经主动断开连接、执行检测sql就会抛出上面的错误。问题的本质还是druid线程池里没有及时清除无效的数据库连接导致。

3、解决办法

  3.1、先分析下目前代码线上的druid参数配置如下:

<bean id="dataSourceTemplate" class="com.alibaba.druid.pool.DruidDataSource" abstract="true" init-method="init"
          destroy-method="close">
        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="3"/>
        <property name="minIdle" value="10"/>
        <property name="maxActive" value="20"/>
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000"/>
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000"/>
        <!--连接最大存活时间,默认是-1(不限制物理连接时间),从创建连接开始计算,如果超过该时间,则会被清理-->
        <property name="phyTimeoutMillis" value="1500000"/>
        <property name="validationQuery" value="SELECT 'x'"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>

        <!-- 打开removeAbandoned功能 -->
        <property name="removeAbandoned" value="true"/>
        <!-- 1800秒,也就是30分钟 -->
        <property name="removeAbandonedTimeout" value="1800"/>
        <!-- 关闭abanded连接时输出错误日志 -->
        <property name="logAbandoned" value="true"/>
        <property name="proxyFilters">
            <list>
                <bean class="com.alibaba.druid.filter.logging.Slf4jLogFilter"/>
                <bean class="com.alibaba.druid.filter.stat.StatFilter">
                    <property name="logSlowSql" value="true"/>
                    <property name="slowSqlMillis" value="5000"/>
                </bean>
            </list>
        </property>
        <property name="filters" value="stat,config,wall"/>
        <property name="connectionProperties"
                  value="config.decrypt=true;druid.log.conn=false;druid.log.stmt=false;druid.log.rs=false;druid.log.stmt.executableSql=true;"/>

    </bean>

各个参数的意思不用多说,官网都有详细解释,不明白的自行去搜索。

3.2、看下druid的源码关于线程池连接失效处理逻辑、对应的是com.alibaba.druid.pool.DruidDataSource类下面shrink(boolean checkTime)方法、源码如下:

public void shrink(boolean checkTime) {
        ArrayList evictList = new ArrayList();

        try {
            this.lock.lockInterruptibly();
        } catch (InterruptedException var13) {
            return;
        }

        try {
            // 线程池里的线程总数 - 核心线程池数(上面配置的是10)
            int checkCount = this.poolingCount - this.minIdle;
            long currentTimeMillis = System.currentTimeMillis();

            int i;
            for(i = 0; i < this.poolingCount; ++i) {
                DruidConnectionHolder connection = this.connections[i];
                if (checkTime) {
                    long idleMillis;
                    if (this.phyTimeoutMillis > 0L) {
                        // 当前时间 - 线程的创建时间、大于配置的phyTimeoutMillis(上面配置的1800s)直接强制回收
                        idleMillis = currentTimeMillis - connection.getTimeMillis();
                        if (idleMillis > this.phyTimeoutMillis) {
                            evictList.add(connection);
                            continue;
                        }
                    }

                    idleMillis = currentTimeMillis - connection.getLastActiveTimeMillis();
                    //线程闲置时间小于 最小存活时间(上面配置的300s)直接跳出判断
                    if (idleMillis < this.minEvictableIdleTimeMillis) {
                        break;
                    }
                    //当前线程池数量超过核心线程数(上面配置的10)直接回收掉多余的线程
                    if (checkTime && i < checkCount) {
                        evictList.add(connection);
                    // 闲置时间超过最大存活时间直接清除(上面没有配置 默认)
                    } else if (idleMillis > this.maxEvictableIdleTimeMillis) {
                        evictList.add(connection);
                    }
                } else {
                    if (i >= checkCount) {
                        break;
                    }

                    evictList.add(connection);
                }
            }

            i = evictList.size();
            if (i > 0) {
                System.arraycopy(this.connections, i, this.connections, 0, this.poolingCount - i);
                Arrays.fill(this.connections, this.poolingCount - i, this.poolingCount, (Object)null);
                this.poolingCount -= i;
            }
        } finally {
            this.lock.unlock();
        }

        Iterator var15 = evictList.iterator();

        while(var15.hasNext()) {
            DruidConnectionHolder item = (DruidConnectionHolder)var15.next();
            Connection connection = item.getConnection();
            JdbcUtils.close(connection);
            this.destroyCount.incrementAndGet();
        }

    }

3.3、可以很直观的看到是由于phyTimeoutMillis配置的时间太大(这种是根据线程时间强制回收连接、对系统不是很友好、将参数值调小也能解决问题)、或者添加如下配置来及时清除无效的连接、个人比较推荐这种方式:

        <!-- 线上配置的mysql断开闲置连接时间为1小时,数据源配置回收时间为3分钟,以最后一次活跃时间开始算  -->
        <property name="maxEvictableIdleTimeMillis" value="180000"/>

3.4、最终调整过后的线上配置如下所示、问题解决:

 <bean id="dataSourceTemplate" class="com.alibaba.druid.pool.DruidDataSource" abstract="true" init-method="init"
          destroy-method="close">
        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="3"/>
        <property name="minIdle" value="10"/>
        <property name="maxActive" value="20"/>
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000"/>
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 超过这个时间每次会回收默认3个连接-->
        <property name="minEvictableIdleTimeMillis" value="30000"/>
        <!-- 线上配置的mysql断开闲置连接时间为1小时,数据源配置回收时间为3分钟,以最后一次活跃时间开始算  -->
        <property name="maxEvictableIdleTimeMillis" value="180000"/>
        <!--连接最大存活时间,默认是-1(不限制物理连接时间),从创建连接开始计算,如果超过该时间,则会被清理-->
        <property name="phyTimeoutMillis" value="15000"/>
        <property name="validationQuery" value="SELECT 'x'"/>
        <!--建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。-->
        <property name="testWhileIdle" value="true"/>
        <!--申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。-->
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>

        <!-- 打开removeAbandoned功能 设置一个连接的租期,如果超过removeAbandonedTimeout时间直接清除连接-->
        <property name="removeAbandoned" value="true"/>
        <!-- 1800秒,也就是30分钟 -->
        <property name="removeAbandonedTimeout" value="1800"/>
        <!-- 关闭abanded连接时输出错误日志 -->
        <property name="logAbandoned" value="true"/>

        <property name="proxyFilters">
            <list>
                <bean class="com.alibaba.druid.filter.logging.Slf4jLogFilter"/>
                <bean class="com.alibaba.druid.filter.stat.StatFilter">
                    <property name="logSlowSql" value="true"/>
                    <property name="slowSqlMillis" value="5000"/>
                </bean>
            </list>
        </property>
        <!--配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙-->
        <property name="filters" value="config"/>

        <!--配置连接的一些属性、config.decrypt=true 表示提供的密码是加密过的-->
        <property name="connectionProperties"
                  value="config.decrypt=true;druid.log.conn=false;druid.log.stmt=false;druid.log.rs=false;druid.log.stmt.executableSql=true;"/>

    </bean>

 

kettle问题:The last packet successfully received from the server was 156 milliseconds ago. 在使用kettle时遇到MySQL数据库连接问题: 1.Navicat可以连接到目标MySQL库,说明不是数据库权限的问题。 2.用kettle可以连接其他同版本MySQL库,说明也不是jar包的问题。 最终,尝试过重启电脑,删除kettle文件重装,替换jar包等各种办法之后,才发现问题在.kettle文件夹里面: 这是出问题时.kettle文件夹下面的文件,比正常文件多了一些东西。 个人的解决办法: 1.备份 kettle.properties 文件,这是平时用的连接资源库的信息 2.删除.kett 阅读详情

相关推荐

克里金插值(Kriging)在MATLAB中的实现(克里金工具箱)

一,直接献上克里金插值MATLAB工具箱 链接:https://pan.baidu.com/s/1p0lt2G8KQ-els7Dyw5jPFg 提取码:wcss 下载后将该程序添加到MATLAB安装文件夹中的/toolbox下,然后在设置路径中添加该程序文件为默认路径即可调用程序。 资源中内附程序使用说明PDF。 二、本人实际操作代码如下所示,标注如下 load data1 %载入数据 %模型参...

qq_40937675的博客 6万+

使用连接池druid报错The last packet successfully received from the server was XXX milliseconds ago.(实测解决)

跑定时任务执行sql脚本的时候,sql的复杂度特别大,又不想优化,客户端跑需要10几秒,在druid连接池中跑任务就报上面的错误了。

偶尔写些东西,意思一下我也参与了内卷 3万+

智能座舱(七)——智能音频系统

本文剖析车载智能音频系统的核心技术,聚焦音响、功放、麦克风和广播收音机四大组件。音响系统通过多声道布局(如23扬声器阵列)结合动态声场校准算法,实现三维声场覆盖;功放系统采用高效D类技术,支持OTA音效调整和故障自愈;麦克风阵列运用波束成形技术实现精准拾音,并保障隐私安全;广播系统融合数字与网络技术提升音质。核心在于硬件标准化与算法差异化的协同,未来将朝集成化、AI个性化方向发展。

DC20160101的博客 1573

数据库连接超时:“The last packet successfully received from the server was xxx milliseconds ago”...

产生的原因:应用方的数据库连接有效期时间,大于数据库自己设置的有效期。 解决方案: 一、修改druid配置(如果使用druid的话) spring.datasource.druid.validationQuery=select 1 spring.datasource.druid.testWhileIdle=true spring.datasource.druid.te...

weixin_30770783的博客 1万+

传感器应用案例:压力传感器在工业自动化中的应用_(13).压力传感器的数据采集与处理

数据采集系统(Data Acquisition System, DAS)是连接传感器和控制系统的重要桥梁。它包括硬件(如数据采集卡、信号调理器)和软件(如数据采集软件、数据处理算法)两部分。信号调理:将传感器输出的模拟信号转换为适合AD转换的信号。AD转换:将模拟信号转换为数字信号。数据传输:将数字信号传输到控制系统或上位机。存储:将采集的数据存储在本地或远程数据库中。实时性:保证数据的实时性和准确性。压力传感器的数据采集与处理是工业自动化中不可或缺的一部分。

2401_87715305的博客 1620

【DEIM创新改进】独家下采样创新改进篇 | ECCV 2026 | DEIM 引入FSD-Down频域-空间动态下采样,在下采样过程中保留小目标的高频信息、助力小目标检测、遥感小目标检测有效涨点

🔥本文提出了一种名为FSD-Down的频域-空间动态下采样模块,用于改进DEIM网络模型在小目标检测中的性能。FSD-Down通过小波分解显式保留低频语义和高频细节,结合分组卷积、动态通道权重和可学习缩放因子,自适应强化目标边缘与纹理特征。该模块能有效减轻传统下采样造成的频率混叠和细节丢失,提升对小目标、密集目标和低对比度目标的检测能力。实验表明,FSD-Down计算开销可控,在保持实时性的同时显著提升检测精度,特别是在VisDrone和AITODv2数据集上对小目标的检测性能提升显著。

Ai缝合怪、助力小伙伴高效发论文 82

mysql连接池报错:The last packet successfully received from the server was XXXXX milliseconds ago

具体报错信息 0:Communications link failure The last packet successfully received from the server was 87,537,289 milliseconds ago. The last packet sent successfully to the 报错日志解释 从服务器成功接收的最后一个数据包是87,537,289(24.3小时)毫秒前。最后一个成功发送到服务器的数据包是0毫秒前。说明这个连接已经24个小时没有从服务器上接

诸葛小猿 2万+

嵌入式AI实战:基于RK3588部署YOLOv11并集成OpenCV实现实时推理(全流程详解)

本文详细介绍了在RK3588芯片上部署YOLOv11目标检测模型的全流程,包括环境搭建、模型转换和实时推理实现。主要内容为:1)通过YOLOv11官方工具将PyTorch模型转为ONNX格式;2)使用RKNN Toolkit2将ONNX模型转换为适配RK3588的RKNN格式;3)在RK3588上结合OpenCV实现实时视频推理功能。教程提供了完整的代码示例和详细步骤说明,帮助开发者快速在边缘设备上部署目标检测模型,实现AI视觉应用的落地。

LXY_LOVE36的博客 213

The last packet successfully received from the server was 4,371,572 milliseconds ago. The last pack

1.1 错误信息: The last packet successfully received from the server was 4,371,572 milliseconds ago. The last packet sent successfully to the server was 18,902 milliseconds ago. at sun.reflect.NativeCo...

把酒问天专栏 1501

FFTW3库在Windows中的安装和使用

Windows 32位平台下载:FFTW Installation on Windows。

weixin_45397344的博客 951

DW3000芯片驱动API介绍

详细介绍DW3000驱动程序API的调用流程说明和中断处理程序流程说明

DT程序员的博客 1521

MySQL数据库提示:Communications link failure,The last packet successfully received...

       Last modified:2013-10-08 14:16:47      **********************************************         web网站使用MySQL数据库,今天突然报以下错误:       Communications link failure,The last packet successfully re...

苳眠の菜鸟 8899

Python爬虫实战:携程/飞猪酒店信息爬取与动态价格分析

在当今数字化旅游时代,酒店预订平台的复杂筛选条件和动态定价机制为数据分析和价格监控带来了巨大挑战。本文将深入探讨如何使用最新的Python爬虫技术来抓取携程和飞猪平台的酒店信息,处理复杂的筛选条件,并解析动态价格数据。本文详细介绍了如何使用最新的Python爬虫技术来抓取携程和飞猪平台的酒店信息。通过结合httpxplaywrightparsel强大的反反爬虫能力:通过浏览器指纹伪装、请求签名、智能延迟等技术应对各种反爬措施高效的数据解析:使用CSS选择器和XPath精确提取所需信息灵活的数据存储。

2201_76125261的博客 414

深度解析数据库连接The last packet successfully received from the server was *xxx* milliseconds ago

相信很多人都遇到过这个问题,看到提示信息,或许大家都明白这不就是获取到的数据库连接超时了嘛,没错,问题的本质也的确如此,常见的解决办法也很简单,比如说从数据库连接池中获取连接的时候判断下连接状态是否正常,这样就可以避免此类问题的发生,如果都是此问题,那么就不会再有本文来赘述问题和解决方案,下面一起来看看造成该问题的几个原因和解决方法。 1.从连接池获取到超时的连接 从数据库连接池获取到超时的连接,目前这种情况大多数数据库连接池中间件都有相应的处理策略,一种是定期扫描连接池中的连接,探测到失效连接后剔除功能,

雨潇的专栏 3万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

mysql链接错误The last packet successfully received from the server was xxx milliseconds ago解决方案

线上项目偶尔出现错误,这个错误发现是在项目无人操作一段时间后就产生,如果有人操作,那就不会出现。

weixin_44487203的博客 2万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

kettle连接数据库报错:The last packet successfully received from the server was 1 milliseconds ago.

kettle连接数据库报错The last packet successfully received from the server was 1 milliseconds ago.

weixin_49588575的博客 5653

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

windows解决:mysql连接报错“The last packet successfully received from the server was xxx milliseconds ago”.

在系统目录下找到my.ini配置文件,以记事本方式打开。最后以管理员身份打开命令窗口,重启mysql服务即可。然后找到[mysqld]将下面两句添加上去,保存。

dd_ddesd的博客 1万+

com.mysql.jdbc.CommunicationsException: The last packet successfully received from the server

com.mysql.jdbc.CommunicationsException: The last packet successfully received from the server was58129 seconds ago.The last packet sent successfully to the server was 58129 seconds ago, which is longer than the server configured value of 'wait_timeout'. Yo

sqlora的专栏 6838

mysql连接报错The last packet successfully received from the server was 10,047 milliseconds ago.

当程序里的Connection超过数据库指定的时长以后,如果还没有会话信息,则服务器会断开此连接,但是客户端是无感知的,当客户端拿着这个断开的连接再去访问时,就会报这个错误信息。poolPingConnectionsNotUsedFor:连接活跃检测的间隔时间,这个时间一定要小于mysql服务器的wait_timeout。此报错信息往往与mysql数据库服务器设置的wait_timeout时间参数有关。poolMaximumIdleConnections:设置空闲时间的连接数。

qq_43750656的博客 8416

The last packet successfully received from the server was 339 milliseconds ago. The last packet sen

原因:应用方的数据库连接有效期时间,大于数据库自己设置的有效期 spring.datasource.hikari.idle-timeout:一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:20秒 但是数据库中设置的有效期是三秒。 解决:修改spring.datasource.hikari.idle-timeout配置为数据库自己设置的时间稍长一点为五秒时,问题解决。 以下是全部异常日志: com.mysql.cj.jdbc.exceptions.Communicatio.

weixin_44447932的博客 4834

The last packet successfully received from the server was 0 millis

备注:本人遇到并处理的方式。

qq_42521108的博客 1521

生产报错日志【The last packet successfully received from the server was 5,007 milliseconds ago】

生产日志报错 显示日志异常为:

qq_36010886的博客 2746

如何解决The last packet successfully received from the server was x milliseconds ago异常问题?

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 93,627,505 milliseconds ago. The last packet sent successfully to the server was 93,627,505 milliseconds ago. is longer than the

一个程序员的修养 3149

The last packet successfully received from the server was 8,098,360 milliseconds ago.

线上环境凌晨5分有个定时任务没执行,查看日志发现报错 The last packet successfully received from the server was 8,098,360 milliseconds ago.  The last packet sent successfully to the server was 1 milliseconds ago. 这个意思是说 从服务器成...

蓝天之枫 4487

Communications link failure:The last packet successfully received from the server was 0 millisecond

出现这种错误的大致情况如下: 1、数据库连接长时间未使用,断开连接后,再去连接出现这种情况。这种情况常见于用连接池连接数据库出现的问题 2、数据库连接的后缀参数问题 针对上述两种情况,解决方案如下 1、修改MySQL的参数,my.cnf位于/etc目录下,修改完成后,重启mysql wait_timeout最大为31536000即1年,在my.cnf中加入: [mysqld] wait_timeout=31536000 interactive_timeout=31536000 2、连接数

LookingTomorrow的博客 1万+

c3p0连接数据库超时问题:The last packet successfully received;The last packet sent successfully to the server

问题描述 java.sql.SQLException: The last packet successfully received from the server was 36,483,780 milliseconds ago. The last packet sent successfully to the server was 36,483,781 milliseconds ago. is ...

沧笙踏歌的博客 3918
上一篇: DruidDataSource源码解析
下一篇: Installing libxml-ruby 2.9.0 with native extensions
java1993666
博客等级 码龄11年 22粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值