数据库很多异常的会话

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

系统的用户操作响应缓慢,数据库很多异常的会话,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,导致连接池被占满,数据库连不上一直占用

相关文章
|
7月前
|
Kubernetes 关系型数据库 MySQL
ChaosBlade常见问题之数据库进行故障注入报错ibdata1文件异常如何解决
ChaosBlade 是一个开源的混沌工程实验工具,旨在通过模拟各种常见的硬件、软件、网络、应用等故障,帮助开发者在测试环境中验证系统的容错和自动恢复能力。以下是关于ChaosBlade的一些常见问题合集:
160 1
|
19天前
|
SQL 数据库
gbase 8a 数据库 shm满导致gclusterd进程异常
gbase 8a 数据库 shm满导致gclusterd进程异常
|
2月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
297 10
|
2月前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
146 6
|
3月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—异常断电导致Oracle数据库数据丢失的数据恢复案例
Oracle数据库故障: 机房异常断电后,Oracle数据库启库报错:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。数据库没有备份,归档日志不连续。用户方提供了Oracle数据库的在线文件,需要恢复zxfg用户的数据。 Oracle数据库恢复方案: 检测数据库故障;尝试挂起并修复数据库;解析数据文件。
|
5月前
|
SQL Oracle 关系型数据库
关系型数据库Oracle结束 RMAN 会话:
【7月更文挑战第25天】
107 1
|
5月前
|
SQL Oracle 关系型数据库
|
6月前
|
存储 缓存 数据库
基于数据库后端的会话
【6月更文挑战第15天】基于数据库后端的会话。
22 4
|
7月前
|
Java 关系型数据库 MySQL
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
|
7月前
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的SET命令:你的数据库会话“调色板”
【4月更文挑战第19天】Oracle SQL*Plus的SET命令是数据库会话的“调色板”,用于设置输出格式、反馈信息和各种偏好。它能调整PAGESIZE和LINESIZE以优化显示,控制ECHO和FEEDBACK开关以定制反馈,以及统计命令执行时间(TIMING)和调试SQL(VERIFY)。更高级的选项如HEADING和COLSEP可改善输出的可读性。通过灵活运用SET命令,能提升工作效率和体验,是数据库管理员和开发者的必备工具。