两种解决异常:“The last packet sent successfully to the server was 0 milliseconds ago. ”的办法

本文详细介绍了当遇到MySQL连接被数据库回收导致的“Thelastpacketsentsuccessfullytotheserverwas0millisecondsago.”异常时的两种解决方案。一是通过修改MySQL配置延长连接回收时间;二是配置连接池进行连接有效性检测,确保使用的连接有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         出现异常”The last packet sent successfully to the server was 0 milliseconds ago.“的大部分原因是由于数据库回收了连接,而系统的缓冲池不知道,继续使用被回收的连接所致的。

           以mysql为例:

           第一种解决办法,就是将mysql回收空闲连接的时间变长,mysql默认回收时间是8小时,可以在mysql目录下的my.ini中增加下面配置,将时间改为1天。

           单位是秒,最大好像是24天:

          [mysqld]

          wait_timeout=86400

           第二种解决办法,可以通过配置,让缓冲池去测试连接是否被回收,如果被回收,则不继续使用,以dbcp为例:

          #SQL查询,用来验证从连接池取出的连接
          dbcp.validationQuery=SELECT 1
          #指明连接是否被空闲连接回收器(如果有)进行检验,如果检测失败,则连接将被从池中去除
          dbcp.testWhileIdle=true
          #在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位,一般比minEvictableIdleTimeMillis小
          dbcp.timeBetweenEvictionRunsMillis=300000
          #在每次空闲连接回收器线程(如果有)运行时检查的连接数量,最好和maxActive一致
         dbcp.numTestsPerEvictionRun=50
          #连接池中连接,在时间段内一直空闲,被逐出连接池的时间(1000*60*60),以毫秒为单位
          dbcp.minEvictableIdleTimeMillis=3600000


 

### 三级标题:解决 MySQL JDBC Communications link failure 上一次通信时间异常 MySQL JDBC 报出 `Communications link failure` 错误,并提示“上一次通信时间异常”时,通常表明数据库连接由于某种原因中断,导致无法正常通信。这种问题可能由网络不稳定、数据库服务响应超时、连接池配置不当或防火墙限制等多种因素引起。 首先,检查网络连接的稳定性是必要的。如果数据库和应用程序不在同一台服务器上,网络延迟或中断可能导致连接失败。可以使用 `ping` 或 `telnet` 命令测试数据库服务器的可达性。此外,确保数据库服务器未被防火墙或安全组规则限制访问,特别是远程连接时需要开放 3306 端口。 其次,数据库服务的响应超时也可能导致此类问题。在某些情况下,执行耗时较长的 SQL 操作(如大数据量查询或更新)可能超过数据库或连接池的等待时间限制,从而导致连接中断。可以通过优化 SQL 查询、增加数据库连接超时时间(`connectTimeout`)和读取超时时间(`socketTimeout`)来缓解这一问题。例如,在 JDBC 连接字符串中添加以下参数: ```java jdbc:mysql://192.168.240.128:3306/p2109_wlcb?characterEncoding=UTF8&connectTimeout=30000&socketTimeout=60000 ``` 此外,连接池配置不当也是常见的原因之一。如果连接池中的连接因长时间未使用而失效,但连接池未能及时检测并清除这些无效连接,应用尝试使用失效连接时就会抛出异常。可以通过配置连接池的空闲连接测试机制来解决此问题。例如,在使用 Druid 连接池时,可以设置 `validationQuery` 来验证连接的有效性,并启用 `testWhileIdle` 和 `testOnBorrow` 参数来确保连接池中的连接始终保持活跃状态: ```xml <property name="validationQuery" value="SELECT 1"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> ``` 对于 MySQL 的“八小时问题”,即连接因长时间空闲而失效的情况,可以在 JDBC 连接字符串中添加 `autoReconnect=true` 参数,让驱动程序在检测到连接失效时尝试重新建立连接。同时,可以设置 `serverTimezone` 参数以确保时区配置正确,尤其是在使用 MySQL 8.0 以上版本时: ```java jdbc:mysql://192.168.240.128:3306/p2109_wlcb?characterEncoding=UTF8&autoReconnect=true&serverTimezone=GMT%2B8 ``` 最后,确保使用的 JDBC 驱动版本与 MySQL 数据库版本兼容。对于 MySQL 8.x 及以上版本,应使用 `com.mysql.cj.jdbc.Driver` 作为驱动类名,并正确配置时区参数。如果使用的是 MySQL 5.x 版本,则应使用 `com.mysql.jdbc.Driver` 作为驱动类名。 ### 代码示例 以下是配置 JDBC 连接字符串和 Druid 连接池的完整示例: ```java String url = "jdbc:mysql://192.168.240.128:3306/p2109_wlcb?characterEncoding=UTF8&autoReconnect=true&serverTimezone=GMT%2B8&connectTimeout=30000&socketTimeout=60000"; String username = "your_username"; String password = "your_password"; ``` Druid 连接池配置示例: ```xml <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="initialSize" value="5"/> <property name="minIdle" value="5"/> <property name="maxActive" value="20"/> <property name="maxWait" value="60000"/> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <property name="minEvictableIdleTimeMillis" value="300000"/> <property name="validationQuery" value="SELECT 1"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> </bean> ``` 通过合理配置 JDBC 连接参数和连接池,可以有效避免 `Communications link failure` 异常的发生,提高数据库连接的稳定性和可靠性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值