当前位置:网站首页 > 数据科学与大数据 > 正文

druid数据库连接池一直满(druid数据库连接数满了)



 一、问题描述:

        最直观的表现就是生产上项目崩了,无法访问

二、分析原因:

        通过查看生产日志,出现了大量的获取连接超时异常,具体如下:

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条记录启动一个线程更新一次,且把事务去掉。

        另外我们这个导入只有一次,和对方系统商量等我们导入完成后他们在启动定时任务。

    

到此这篇druid数据库连接池一直满(druid数据库连接数满了)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 数据库端口被占用怎么解决(数据库端口访问不了怎么办)2025-02-17 12:54:07
  • sundb数据库(sundb数据库怎么用)2025-02-17 12:54:07
  • 读取bytebuffer里的内容(bytebuf 读取所有数据)2025-02-17 12:54:07
  • 数据库课程表怎么建(数据库创建课程信息表)2025-02-17 12:54:07
  • msp432p401r(msp432p401R单片机用什么型号的数据线)2025-02-17 12:54:07
  • druid数据库连接池密码加解密配置(druid数据库连接池不释放)2025-02-17 12:54:07
  • 大数据培训和不培训的区别(大数据培训出来好惨淡)2025-02-17 12:54:07
  • 大数据学习路线(大数据自学路线)2025-02-17 12:54:07
  • 数据库增删改查功能称为(数据库增删改查怎么实现的)2025-02-17 12:54:07
  • 小米手机数据如何导入vivo手机(怎么从小米手机导入vivo手机)2025-02-17 12:54:07
  • 全屏图片