记录一次线上事故:GetConnectionTimeoutException: wait millis 60000, active 20, maxActive 20, creating 0

news/2024/11/6 11:39:18/

        前几天同事说项目出问题了,请求一直报错,我看了下服务器日志,发现服务器一直报错Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 20, maxActive 20, creating 0

        大致意思是druid的连接数(20)已经达到了最大连接数(20),无法提供数据库连接。我就很疑惑,目前我们项目的并发量也不是很高,怎么会出这种问题呢?而且这20个连接一直都不会释放,出现了这个错误之后,关于数据库的接口全部用不了了。

        然后我重启了一下服务器,可以正常访问了。但是过了几天之后,还是出现了这个问题,我就去网上查了些解决方案,配置了druid的回收超时的连接设置:

properties配置:

#druid recycle Druid的连接回收机制
#不建议在生产环境中使用,会影响性能,仅用于连接泄露检测诊断
#超过时间限制是否回收
spring.datasource.druid.removeAbandoned = true
#超时时间;单位为秒。180秒=3分钟
spring.datasource.druid.removeAbandonedTimeout = 180
#关闭abanded连接时输出错误日志
spring.datasource.druid.logAbandoned = true

xml配置:

<!-- RemoveAbandanded功能不建议在生产环境中使用,会影响性能,仅用于连接泄露检测诊断 -->
<property name="removeAbandoned" value="true" /> <!-- 打开removeAbandoned功能 -->
<property name="removeAbandonedTimeout" value="180" /> <!-- 180秒,也就是3分钟 -->
<property name="logAbandoned" value="true" /> <!-- 打开abanded连接时输出错误日志 -->

        结果第二天日志中果然出现了druid回收超时连接的错误:

检查了代码后得到结论如下:

1、WeatherService类上加了@Transactional注解,进入这个方法就开始事务,申请了数据库连接。

2、这个方法内调用了BaseUtils的httpGet方法,发起了http请求,某些原因(网络异常之类的)导致这个请求一直卡住(没有设置请求超时时间,所以它会一直卡住),这个线程就一直卡住在这里,所以数据库连接就一直被占用着不释放了。那么如果来20个这种请求,数据库连接池里面的连接就被占完了。。。。

解决方法:

设置申请连接超时时间和socket响应超时时间,如果超过时间会报错

HttpGet httpGet = new HttpGet(url);
// 设置请求超时时间
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) // 设置申请连接超时时间,单位毫秒。.setSocketTimeout(5000) //如果socket响应超时时间,单位毫秒.build();
httpGet.setConfig(requestConfig);

        第二天一看日志,果然是报了请求超时的错,没有报连接池占满的错了。

···············至此问题解决················


http://www.ppmy.cn/news/601595.html

相关文章

【完美解决】- 使用JavaApI 连接查询HBASE 出现 java.net.SocketTimeoutException: callTimeout=60000

1.报错 org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts36, exceptions:Tue May 28 08:16:11 CST 2019, null, java.net.SocketTimeoutException: callTimeout60000, callDuration63316: cm5 row stu01,, on table hbase:meta at regionhb…

mysql快速插入60000条数据

学习mysql 快速插入60000条数据&#xff0c;表字段&#xff08;id,name,nicheng&#xff09;主键id自增情况 昨天刚刚学习到的有一种写法: delimiter \ drop procedure if exists proc_if; CREATE PROCEDURE proc_if () BEGIN declare i int default 0; lp1 : LOOP //定义循环体…

使用springboot+easyExcel+MySQL读取并储存,60000+条数据

使用springbootmybatisPluseasyExcelMySQL读取并储存&#xff0c;60000条数据&#xff0c;15秒 闲话少说&#xff0c;直接开摆&#xff0c;记录一下最近用到的知识。 测试耗时&#xff08;ms&#xff09;读取6万条数据储存到MySQL&#xff0c;连续测试了五次&#xff0c;综合…

【数据结构OJ题】移除链表元素

移除链表元素 原题链接&#xff1a;力扣 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回新的头节点 。 方法一&#xff1a;原地删除节点 思路&#xff1a; 首先&#xff0c;定义两个指针&#xff1…

vue3.0 + elementUI 弹窗二次封装

使用组件&#xff1a; <page-dialog v-model:dialogShow"gisLock" footerCustom>{{gisLock}}</page-dialog><page-dialog v-model:dialogShow"gisLock">{{gisLock}}<template #dialog-button><el-button type"primary&quo…

对新手来说,一句 Hello World 能有多少坑?

入门教程、案例源码、学习资料、读者群 请访问&#xff1a;python666.cn 大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 在编程届&#xff0c;有一个不成文的习惯&#xff1a;在教授/学习一门新语言时&#xff0c;会以输出“Hello World”作为第一个代码实例。 因…

javascript网站背景音乐

∶∶网站背景音乐∶∶ [怎么添加背景音乐]&#xff1a;将这段代码插入到您的<首页布告>内容中&#xff0c;当您打开网站时即可听到背景音乐&#xff1a; <bgsound src/textbook/matter/music/china.mid loop"-1"> [怎么换成自己喜欢的音乐]&#xff1a;…

剪切的文件还能恢复吗?挽救误操作

在我们使用电脑过程中&#xff0c;剪切文件是一个很常见的操作&#xff0c;因为将文件剪切下来再粘贴到其他地方可以更好地管理文件。但是&#xff0c;一些用户会在操作过程中意外地将文件在移动到目标位置之前剪切了&#xff0c;导致丢失了重要文件。在这种情况下&#xff0c;…