数据库很多异常的会话

简介: 数据库很多异常的会话

系统的用户操作响应缓慢,数据库很多异常的会话,maxWait这个属性值Druid默认值是-1,导致连接池被占满,数据库连不上一直占用

故障现象

问题影响时间:7月12号 08:21点-09:30点

现象:无法进入系统,已进入系统的用户操作响应缓慢

故障处理过程

08:52 A开始反馈 xx-prod 进不去,数据库很多异常的会话

image.png

08:57-09:15 B进通过grafna和数据库库行了问题的定位,重启应用

image.png



09:18 实例重启成功后,问题依然无法正常服务

09:20-09:25 C通过慢请求定位到申请单查询接口特别慢,定位到是阿里商旅服务的异常

image.png

image.png



09:30 D 重启阿里商旅服务,重启后,实例开始正常工作。

故障原因

  1. 阿里商旅服务异常。通过分析stack,主要是拿不到数据库的链接,导致ice 线程池被占满,导致其他的请求无法请求。导致代码拿不到连接的原因如下:
  1. 分析堆栈信息发现大部分的线程都是阻塞的状态
  2. image.png


 b. 分析具体的某个阻塞的线程,发现是因为事务导致的拿不到链接导致的

image.png


c. 通过堆栈信息,可以发现是事务的注解不规范导致的。不应该在类上添加事务的注解,应该加在具体的方法上。

image.png



  1. ice 框架的超时时间设置没有生效。阿里商旅这个服务比较特殊,依赖了钉钉的sdk,只用的jdk1.8,所有的jar包有没有升级到最新的,目前service-common 已经更新到3.2.23,而阿里商旅用的还是1.5.6 。
  2. 代码中的逻辑不是最优的,报销单关联申请单明细的时候,遍历申请单的明细接口,返回了申请单的所有信息,可以修改为只返回前端需要的信息。


首先从stack中可以看出来:

image.png



这里大量的ICE线程在进入了DruidDataSource#takeLast方法后就进入了WAITING的状态;

因此查看了下这个服务用到的Druid版本(1.1.21)对应的代码:

image.png


可以看到notEmpty#await方法让当前线程一直进入WAITING状态等待唤醒。

进入这个分支,说明DruidConnectionHolder连接池容器中没有连接了,因此一直等待有空闲线程去唤醒,同时,这里没有设置超时时间,理论上会一直占用着当前线程,因此线上会出现ICE线程池满的情况(其实是大量线程都在waiting)。

回到最开始的入口方法DruidDataSource#takeLast,进入这个方法的前提是maxWait小于0(默认是-1),如果我们设置maxWait > 0,就会进入有超时时间的分支,线程会尝试获得锁,超过超时时间直接返回null,可以避免线程一直WAITING

image.png

image.png


maxWait这个属性值Druid默认值是-1,可以显式通过设置maxWait的方式来优化,设置一个合理的预期时间值,释放ICE线程去做其他事不要因为数据库连不上一直占用

反思与改进方案

系统的用户操作响应缓慢,数据库很多异常的会话,maxWait这个属性值Druid默认值是-1,导致连接池被占满,数据库连不上一直占用

相关文章
|
算法 前端开发 Java
信创环境下达梦数据库唯一索引异常无法拦截DuplicateKeyException
迁移到达梦数据库后,发现我们的全局异常拦截中的唯一索引异常 无法被正常拦截,给前端直接抛出了数据库原始的错误信息,对用户极其不友好。如果不对唯一索引异常拦截,则默认 与 的异常信息如下:在 中通过 注解,实现对异常响应的统一封装。可参考:全栈开发之后端脚手架:SpringBoot集成MybatisPlus代码生成,分页,雪花算法,统一响应,异常拦截,Swagger3接口文档以下是对数据库唯一索引异常的拦截,统一返回:编号不可重复。 问题分析 对主流的数据库的异常进行了封装与翻译,对于 都可以进行拦截,但是到了国产数据库,比如这里是达梦8,那么其异常信息 `Spring` 就不认识
1618 0
|
1月前
|
SQL Oracle 关系型数据库
调整OceanBase数据库的系统时间,即使只调小1秒导致异常并不是正常现象
【2月更文挑战第21天】调整OceanBase数据库的系统时间,即使只调小1秒导致异常并不是正常现象
33 7
|
3月前
|
关系型数据库 MySQL 数据库
使用Flink同步MySQL到doris数据库中,时间格式异常
当我完成同步时,我发现Doris数据库中的所有时间格式都变为了如此:1970-02-01 11:00:00.000000,在所有时间格式后面追加了一个点和6个零,这是怎样造成的,该如何解决这个问题
|
3月前
|
SQL 监控 关系型数据库
解密SQL性能异常事件及阿里云数据库的性能调优实践
作为开发者想必都知道数据库是现代应用的核心组件之一,而且在当今互联网时代之下,SQL查询的性能直接影响系统的整体性能,它的性能对于系统的稳定性和响应速度至关重要。那么本文就来讨论一下SQL性能异常的排查和优化方法,包括我个人印象深刻的SQL性能异常事件,以及分享一下使用阿里云数据库产品/工具进行SQL性能调优的经验和心得体会。
85 1
解密SQL性能异常事件及阿里云数据库的性能调优实践
|
4月前
|
SQL 监控 数据库
Greenplum【异常 02】使用Navicat的服务器监控工具解决Greenplum数据库锁表问题
Greenplum【异常 02】使用Navicat的服务器监控工具解决Greenplum数据库锁表问题
31 0
|
4月前
|
消息中间件 数据库连接 数据库
py 多进程 引发的 各种数据库连接 消息队列连接 异常问题 简单分析
py 多进程 引发的 各种数据库连接 消息队列连接 异常问题 简单分析
38 0
|
6月前
|
数据库连接 API Nacos
Nacos在启动时会检查数据库连接,如果连接失败,它会抛出一个异常并退出
Nacos在启动时会检查数据库连接,如果连接失败,它会抛出一个异常并退出
109 7
|
9月前
|
数据库
数据库并发与并发异常
数据库并发与并发异常
107 0
|
10月前
|
SQL Oracle 关系型数据库
数据库连接报错之IO异常(The Network Adapter could not establish the connection)
有以下四个原因: 1. ORACLE数据库 1、oracle配置 listener.ora 和tnsnames.ora 文件里面查看是否配置正确
1702 1
|
JSON Java 关系型数据库
springboot基础入门之json转换框架 、全局异常捕捉以及JPA连接数据库
springboot基础入门之json转换框架 、全局异常捕捉以及JPA连接数据库

热门文章

最新文章