Java Communications link failure| Java Debug 笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: Java Communications link failure| Java Debug 笔记

问题背景

运营人员在系统选择了一批数据,然后提交请求处理,一段时间后,运营找到开发说,我提交的数据一部分成功了,剩下的一部分还在处理中状态,一直没有更新。

定位分析思路

通过kibana日志追踪(代码中业务日志),如图,请求的确是已受理,并且依赖的微服务也返回了结果,但是最终修改数据库对应数据的状态却没执行!

Timev message 
修改订单案件状态为提交成功:[[1cf84055-9a0b-4b79-ac77-824f5572d732]]  
成功  修改订单案件状态为提交成功:「50f08238f-758a-41b1-a8ef-f8590684cc44,29e8838f-bb16-4bcf-9599-dcaf456a3afc,2498bfe0-1598-41c7-ad60-aebe42cdc79c, 144d3c1a-d7db 
4101-8f5e-fd67fdf8bbd1,2db04af1-ce96-47c4-9667-a1e4b7f395d1,3312667f-f503-4622-bc51-641e4189f582,250ac540-f7e3-49b4-a2fd-d43eb275ffa9]阳稀十掘金技术社区

起初以为是代码问题,但是再次code review并没有发现问题,而且运营也说了部分成功,让他们再次操作也都再次成功了。那么既然review代码没有发现问题,就再看看日志,是否有其他错误出现。

从代码发现log.info()日志后,下一步就是更新数据操作,所以便想到查看周围日志了解情况,点击这里,如图

  修改订单案件状态为提交成功:「[0f08238f-758a-41b1-a8ef-f8590684cc44,29e8838f-bb16-4bcf-9599-dcaf456a3afc,2498bfe0-1598-41c7-ad60-aebe42cdc79c, 144d3c1a-d7db 
4101-8f5e-fd67fdf8bhd1,2db04af1-ce96-47c4-9667-a1e4h7f395d1,3312667f-f503-4622-hc51-641e4189f582,250ac540-f7e3-49h4-a2fd-d43eh275ffa91

发现一个附近有一个error log

discard connection  
com.mysq1.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The 1ast packet successfully received from the server was 1,927,021milliseconds ago.The 1ast packet sent successfully to the server was 0 milliseconds ago
atsun.reflect.GeneratedConstructorAccessor276.newInstance(Unknown Source)
atsun.reflect.DelegatingConstructorAccessorImp1.newInstance(DelegatingConstructorAccessorImp1.java:45) atjava.1ang.reflect.Constructor.newInstance(Constructor.java:423)
成功,修改订单案件状态为提交成功:b  L43Raf_f8r  4cc44,  _hhig_thef ocon   .7db-4101 
47c4-9667-a1  --7f-f503-4022

来分析一下这段话的意思:

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服务在长时间不连接之后断开了,断开之后的首次请求会抛出这个异常

  1. 检查你的数据库连接地址(配置文件中的url)是否正确.
  2. 重启应用程序。(不建议,治标不治本)
  3. mysql5以前的版本可以直接在jdbc连接url的配置中附加上autoReconnect=true
  4. 查看和连接mysql时间有关的系统变量:
show variables like '%timeout%'
  1. acd1166623bdfc5b9b9412e61b0a842.png
  • interactive_timeout:默认值:28800秒(8小时) 服务器关闭交互式连接前,等待活动的秒数。(交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端)
  • wait_timeout:默认值:28800秒(8小时) 服务器关闭非交互连接之前,等待活动的秒数。在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。

如果在wait_timeout秒期间内,数据库连接(java.sql.Connection)一直处于等待状态,mysql5就将该连接关闭。这时,你的Java应用的连接池仍然合法地持有该连接的引用。当用该连接来进行数据库操作时,就碰到上述错误。

  1. 将mysql的全局变量wait_timeout的值修改为最大。查看mysql5的手册,发现windows和linux下wait_timeout的最大值分别是24天和365天
  1. 在文件my.ini的最后增加一行:wait_timeout=1814400。(该文件,windows下在mysql的安装目录下,linux下位置为/etc/my.ini)
  2. 重启mysql。
  1. 如果经过了以上的步骤,你的问题依旧没有的到解决,则建议你修改下你程序中的mysql驱动的版本。

扩展知识

mysql JDBC URL格式

jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值2]...

5aea3c3ba91644892c49323dbe80cd3.png

在使用数据库连接池的情况下,最好设置如下两个参数

autoReconnect=true&failOverReadOnly=false

mysql与jdbc的操作文档

mysql5.1 jdbc 官方文档

mysql8.0 jdbc 官方文档

连接泄漏问题

从连接池中获取连接使用后忘记了连接的关闭,这样连池的连接就会逐渐达到maxActive直至连接池无法提供服务。可以使用如下方式避免该问题发生:

#对于建立连接过长的连接强制关闭  
druid.removeAbandoned:true
#如果连接建立时间超过了30分钟,则强制将其关闭  
druid.removeAbandonedTimeout:1800
#将当前关闭动作记录到日志  
druid.logAbandoned:true
复制代码

removeAbandoned是连接池的高级功能,理论上这中配置不应该出现在实际的生产环境,因为有时应用程序执行长事务,可能这种情况下,会被连接池误回收,该种配置一般在程序测试阶段,为了定位连接泄漏的具体代码位置,被开启。生产环境中连接的关闭应该靠程序自己保证

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
20天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
174 37
|
20天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
6天前
|
JSON Java Maven
关于使用Java-JWT的笔记
这篇文章介绍了使用Java-JWT库来生成和验证JSON Web Tokens (JWT) 的方法。文中解释了JWT的组成,包括头部、载荷和签名,并提供了如何使用java-jwt库生成和验证token的示例代码。此外,还提供了Maven依赖和一些关于token的标准声明和自定义声明的解释。
关于使用Java-JWT的笔记
|
21天前
|
Java 开发者 数据格式
【Java笔记+踩坑】SpringBoot基础4——原理篇
bean的8种加载方式,自动配置原理、自定义starter开发、SpringBoot程序启动流程解析
【Java笔记+踩坑】SpringBoot基础4——原理篇
消息中间件 缓存 监控
81 0
|
21天前
|
运维 Java 关系型数据库
【Java笔记+踩坑】SpringBoot基础2——运维实用
SpringBoot程序的打包与运行、临时配置、多环境配置、日志
【Java笔记+踩坑】SpringBoot基础2——运维实用
|
21天前
|
Java 数据库连接 API
【Java笔记+踩坑】Spring Data JPA
从常用注解、实体类和各层编写方法入手,详细介绍JPA框架在增删改查等方面的基本用法,以及填充用户名日期、分页查询等高级用法。
【Java笔记+踩坑】Spring Data JPA
|
21天前
|
SQL Java 数据库连接
【Java笔记+踩坑】MyBatisPlus基础
MyBatisPlus简介、标准数据层开发CRUD、业务层继承IService、ServiceImpl、条件查询、LambdaQueryWrapper、id生成策略、逻辑删除、乐观锁@Version、代码生成器、ActiveRecord
【Java笔记+踩坑】MyBatisPlus基础
|
21天前
|
前端开发 Java 数据库连接
【Java笔记+踩坑】SpringBoot——基础
springboot三种配置文件及其优先级、多环境配置、springboot整合junit,mybatis、ssmp综合图书案例
【Java笔记+踩坑】SpringBoot——基础
|
21天前
|
Java 数据库连接 Maven
【Java笔记+踩坑】Maven高级
分模块开发、依赖传递与冲突问题、 可选依赖和排除依赖、聚合和继承、属性、多环境配置与应用、私服安装和使用
【Java笔记+踩坑】Maven高级
下一篇
无影云桌面