记一次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基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys