本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看
活动链接
运营人员在系统选择了一批数据,然后提交请求处理,一段时间后,运营找到开发说,我提交的数据一部分成功了,剩下的一部分还在处理中状态,一直没有更新。
定位分析思路
通过
kibana
日志追踪(代码中业务日志),如图,请求的确是已受理,并且依赖的微服务也返回了结果,但是最终修改数据库对应数据的状态却没执行!
起初以为是代码问题,但是再次
code review
并没有发现问题,而且运营也说了部分成功,让他们再次操作也都再次成功了。那么既然review代码没有发现问题,就再看看日志,是否有其他错误出现。
从代码发现
log.info()
日志后,下一步就是更新数据操作,所以便想到查看周围日志了解情况,点击这里,如图
发现一个附近有一个
error log
来分析一下这段话的意思:
discard connection: 丢起连接 Communications link failure:通信链路故障 he last packet successfully received from the server was 1,927,021 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago: 它最后一次成功收到来自服务器(mysql server)的数据包是在1,927,021毫秒之前。最后一个成功发送到服务器的报文是0毫秒之前
错误的原因:MySQL服务在长时间不连接之后断开了,断开之后的首次请求会抛出这个异常
-
检查你的数据库连接地址(配置文件中的url)是否正确.
-
重启应用程序。(不建议,治标不治本)
-
mysql5
以前的版本可以直接在jdbc连接url的配置中附加上
autoReconnect=true
。
-
查看和连接mysql时间有关的系统变量:
show variables like '%timeout%'
> *
interactive
timeout:默认值:28800秒(8小时)
服务器关闭交互式连接前,等待活动的秒数。(交互式客户端定义为在mysqlreal
connect()中使用CLIENT
INTERACTIVE选项的客户端) > *
wait
timeout:默认值:28800秒(8小时)
服务器关闭非交互连接之前,等待活动的秒数。在线程启动时,根据全局
wait_timeout
值或全局
interactive_timeout
值初始化会话
wait_timeout
值,取决于客户端类型(由mysqlreal
connect()的连接选项CLIENT
INTERACTIVE定义)。
如果在
wait_timeout
秒期间内,数据库连接
(java.sql.Connection)
一直处于等待状态,
mysql5
就将该连接关闭。这时,
你的Java应用的连接池仍然合法地持有该连接的引用。当用该连接来进行数据库操作时,就碰到上述错误。
-
将mysql的全局变量
wait_timeout
的值修改为最大。查看mysql5的手册,发现windows和linux下
wait_timeout
的最大值分别是
24天和365天
。
-
在文件my.ini的最后增加一行:wait_timeout=1814400。(该文件,windows下在mysql的安装目录下,linux下位置为/etc/my.ini)
-
重启mysql。
-
如果经过了以上的步骤,你的问题依旧没有的到解决,则建议你修改下你程序中的mysql驱动的版本。
mysql JDBC URL格式
jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值2]...
在使用数据库连接池的情况下,最好设置如下两个参数
autoReconnect=true&failOverReadOnly=false
mysql与jdbc的操作文档
mysql5.1 jdbc 官方文档
mysql8.0 jdbc 官方文档
连接泄漏问题
从连接池中获取连接使用后忘记了连接的关闭,这样连池的连接就会逐渐达到maxActive直至连接池无法提供服务。可以使用如下方式避免该问题发生: ```
对于建立连接过长的连接强制关闭
druid.removeAbandoned:true
如果连接建立时间超过了30分钟,则强制将其关闭
druid.removeAbandonedTimeout:1800
将当前关闭动作记录到日志
druid.logAbandoned:true ```
removeAbandoned
是连接池的高级功能,理论上这中配置不应该出现在实际的生产环境,
因为有时应用程序执行长事务,可能这种情况下,会被连接池误回收
,该种配置一般在程序测试阶段,为了定位连接泄漏的具体代码位置,被开启。
生产环境中连接的关闭应该靠程序自己保证
。
关注+点赞👍收藏❤️不迷路
``` 文章每周持续更新,可以微信搜索「 十分钟学编程 」第一时间阅读和催更,如果这个文章写得还不错,觉得有点东西的话
各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
theme: channing-cyan本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接问题背景运营人员在系统选择了一批数据,然后提交请求处理,一段时间后,运营找到开发说,我提交的数据一部分成功了,剩下的一部分还在处理中状态,一直没有更新。定位分析思路通过kibana日志追踪(代码中业务日志),如图,请求的确是已受理,并且依赖的微服务也返...
java
后台显示:
Communication
s
link
failu
re
通信链路故障
咱们先说说这个,链路故障 表明没法连接线上的
mysql
服务,确定了错误后咱们再看看线上环境~
com.
mysql
.cj.jdbc.exceptions.
Communication
sException:
Communication
s
link
failu
re
The last packet sent successfully to the server was 0 milliseconds a
首先list里有5000个人,首先for循环一个个拿这个人,根据这个人id查出基础数据,然后经过一系列复杂逻辑,开始第二次循环,一直循环到人结束
错误:在跑的过程中总是会出现
数据库
通讯链路异常,老是跑到一半就报错
2020-08-06 14:49:59.095 ERROR 14328 --- [nio-9090-exec-8] c.a.druid.pool.DruidPooledStatement :
Communication
sException, druid version 1.1.1
com.
mysql
.jdbc.exceptions.jdbc4.
Communication
sException:
Communication
s
link
failu
re
The last packet sent successfull
网上搜索关键词
Communication
s
link
failu
re,有很多解决方案,但是都没有解决我的问题。
然后重复多次重装docker,重新生成镜像,容器,重新本地连接服务器docker上的
mysql
容器后,突发奇想。感觉可以把配置文件中的localhost改为服务器的ip地址试试,然后就成功了。
因为一直就是localhost,所以在部署的时候就没有注意,并且其他博客的有个解决方法还是把ip改为localhost,就更没注意了。。。
数据库
连接报错
Communication
s
link
failu
re 连接失败可能的原因有
1.
mysql
数据服务没有开启
2.网络问题 在当前服务器ping 一下看看是否能连接上
mysql
服务器
3.wait_timeout的值需要大于
数据库
连接池的最大超时时间,否则
数据库
把连接关了而连接池还没关则造成连接不可使用
mysql
数据库
有一个 wait_timeout(非交互连接超时时间,即jdbc连接) 和interactive_timeout(交互连接超时时间,即客户端连接)配置,默认是8小时,8小
问题描述:
com.
mysql
.cj.jdbc.exceptions.
Communication
sException:
Communication
s
link
failu
re
问题分析:
1、
数据库
已关闭当前连接,导致报错。
|--报错内容
com.
mysql
.cj.jdbc.exceptions.
Communication
sException:
Communication
s
link
failu
re
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any...
15:43:03.306 [http-nio-8080-exec-5] ERROR com.alibaba.druid.pool.DruidDataSource - discard connection
com.
mysql
.jdbc.exceptions.jdbc4.
Communication
sException:
Communication
s
link
failu
re
The last packet successfully received from the server was 74,