网站程序上传,建筑工程公司名字起名大全,代理网页免费,响应式网站模板下载免费一、问题描述#xff1a; 最直观的表现就是生产上项目崩了#xff0c;无法访问。
二、分析原因#xff1a; 通过查看生产日志#xff0c;出现了大量的获取连接超时异常#xff0c;具体如下#xff1a;
org.springframework.jdbc.CannotGetJdbcConnectionException:Fail… 一、问题描述 最直观的表现就是生产上项目崩了无法访问。
二、分析原因 通过查看生产日志出现了大量的获取连接超时异常具体如下
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更新多个字段内容如果数据不存在则是插入记录。且这个导入功能的接口上加了事务注解。还有一个就是代码问题这个导入接口的循环代码写的有问题造成循环次数成倍增加。这就造成这个导入功能执行的时间很长大概10个小时左右。 好巧不巧正在我们导入数据的时候另外一个系统的定时任务启动了大概功能是更新我们这个表的的数据。这个作业是逐条更新我们表记录。 由于我们导入功能的接口有事务且执行时间长所以更新的记录都锁着等待事务提交后释放锁。在数据还没有导入完(即事务还没有提交时)其他系统有更新这张表里我们锁定的数据且对方系统是调我们接口是每次更新一条记录每一调一次就占用一个数据库连接且对方系统基本上都是更新我们锁了的记录。只要调我们19次锁定的记录连接池里20个连接数就用完了。因为数据一直被锁着等待60秒没有获取连接就抛出了上面的异常。 这就造成了连接池泄露如果连接池泄露就会造成系统崩溃具体连接池泄露如何造成系统崩溃的不知道原因希望了解的大神指点一二。
三、解决办法 把导入功能改成异步导入每1000条记录启动一个线程更新一次且把事务去掉。 另外我们这个导入只有一次和对方系统商量等我们导入完成后他们在启动定时任务。