记一次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

相关文章

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r