记一次com.mysql.jdbc.exceptions.jdbc4.CommunicationsException异常排查

本文主要是介绍记一次com.mysql.jdbc.exceptions.jdbc4.CommunicationsException异常排查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

具体异常为:

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 51,440,515 milliseconds ago.  The last packet sent successfully to the server was 51,440,517 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
8589f98c3c60:	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
8589f98c3c60:	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
8589f98c3c60:	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
8589f98c3c60:	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
8589f98c3c60:	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
8589f98c3c60:	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990)
8589f98c3c60:	at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3746)
8589f98c3c60:	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2509)
8589f98c3c60:	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
8589f98c3c60:	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2484)
8589f98c3c60:	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
8589f98c3c60:	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1966)
8589f98c3c60:	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3188)
8589f98c3c60:	at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:465)
8589f98c3c60:	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3185)
8589f98c3c60:	at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeQuery(PreparedStatementProxyImpl.java:181)
8589f98c3c60:	at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:227)

这个问题首先排查到的是,druid的session没有清理没有用的session导致的,网上也有很多这种解决版本,关于druid的配置都配上了,在本地断点调试的时候,都能发现当异常的时候,没用的session都会被清除。那为什么还一直报以上的异常呢,后面发现并不是druid的问题,是我们使用了spring的事务管理,我们用的是编程式事务,当有一个connection开启了事务之后,它会把connection存储在一个TransactionSynchronizationManager的

ThreadLocal<Map<Object, Object>> resources =new NamedThreadLocal<>("Transactional resources");

这里是跟线程有关的,当用线程池访问时候,如果你不清空这个resources ,里面的connection就会一直都在,也就是说一直可以被拿出来执行,但是对于数据库来说,一个connection默认是8个小时就会被收回,变为无用的状态,如果resource这里面的connection一直不清理就一直报这个错误,那至于怎样清理这个session?如果是编程式事务,需要调用commit或rollback,里面就会调用cleanupTransactionInfo()来清理这个connection,所以这次的异常根本原因就是我们代码中存在没有commit或rollback一个connection,所以使用编程式事务一定要很小心。

重现代码块:

    public void test2() {try{PlatformTransactionManager transactionManager = transactionTemplate.getTransactionManager();TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED));//DruidPooledConnection connection = druidDataSource.getConnection();//PreparedStatement statement = connection.prepareStatement("select 1");int i = swjDao.execute("update bd_stock set name = \"code71\" where id = \"02daa8\"",new HashMap<>());System.out.println(i);System.out.println("test2");//transactionManager.rollback(transactionStatus);//transactionManager.commit(transactionStatus);// connection.close();}catch (Exception e){e.printStackTrace();}}

 

这篇关于记一次com.mysql.jdbc.exceptions.jdbc4.CommunicationsException异常排查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

MySQL 衍生表(Derived Tables)的使用

《MySQL衍生表(DerivedTables)的使用》本文主要介绍了MySQL衍生表(DerivedTables)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录一、衍生表简介1.1 衍生表基本用法1.2 自定义列名1.3 衍生表的局限在SQL的查询语句select

MySQL 横向衍生表(Lateral Derived Tables)的实现

《MySQL横向衍生表(LateralDerivedTables)的实现》横向衍生表适用于在需要通过子查询获取中间结果集的场景,相对于普通衍生表,横向衍生表可以引用在其之前出现过的表名,本文就来... 目录一、横向衍生表用法示例1.1 用法示例1.2 使用建议前面我们介绍过mysql中的衍生表(From子句

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二:

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA