一、问题描述:
最直观的表现就是生产上项目崩了,无法访问。
二、分析原因:
通过查看生产日志,出现了大量的获取连接超时异常,具体如下:
org.springframework.jdbc.CannotGetJdbcConnectionException:Failed to obtain JDBC Connection;nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException:
wait millis 60000,active 20,maxActive 20,creating 0,runningSqlCount20: UPDATE TAB_A SET F1_NAME=?,F2=?,F3=? WHERE ID=?
我们项目druid的最大连接数配置的是20,最大等待时间是60s
从报错日志可以看出20连接全部被占用了,没有可用的连接了。
通过打印的堆栈信息找到对应的代码,结合业务场景。大概如下:
大概是我们有一个功能是从execl导入大量数据,这个导入功能读取到execl数据后,循环遍历每条记录,如果判断这条数据已经存在,这根据id更新多个字段内容,如果数据不存在则是插入记录。且这个导入功能的接口上加了事务注解。还有一个就是代码问题,这个导入接口的循环代码写的有问题,造成

项目因数据导入功能引发的事务阻塞,导致连接池耗尽资源。通过分析发现事务、循环代码问题及并发执行,解决方法包括异步导入和调整系统执行顺序。

4788

被折叠的 条评论
为什么被折叠?



