数据库死锁严重引发中间件连接池满故障诊断

1、故障现象

前台系统应用无法登陆,weblogic服务器应用程序的运行状态显示为overload,线程连接池满。

2、故障原因分析

根据上述故障现象,分析基础可以确定为是Weblogic有过多的连接连到数据库,因为会话一直保持未释放,将连接池占满后,导致新的连接无法请求到连接池。在此关键是分析为什么会有大量的会话占满连接池而不释放。

3、问题分析过程

3.1 session数超过1000


 


Snap Id


Snap Time


Sessions


Cursors/Session


Begin Snap:


38194


2014/12/10 8:00


1010


13.8


End Snap:


38196


2014/12/10 10:00


1004


14.4


Elapsed:


 


119.65 (mins)


 


 


DB Time:


 


20,686.23 (mins)


 


 

3.2 每秒执行次数超过15000多次


Per Second


Per Transaction


Redo size:


18,144,642.95


459,254.26


Logical reads:


199,155.23


5,040.77


Block changes:


100,209.94


2,536.39


Physical reads:


5,241.51


132.67


Physical writes:


2,182.48


55.24


User calls:


16,134.45


408.37


Parses:


177.18


4.48


Hard parses:


69.02


1.75


Sorts:


106.97


2.71


Logons:


0.58


0.01


Executes:


15,955.55


403.85


Transactions:


39.51


 

3.3 94%的等待时间都是花在“enq: TX -row lock contention”


Event


Waits


Time(s)


Avg Wait(ms)


% Total Call Time


Wait Class


enq: TX - row lock contention


2,419,702


1,174,344


485


94.6


Application


CPU time


 


28,795


 


2.3


 


db file sequential read


2,507,054


13,011


5


1


User I/O


db file scattered read


2,358,449


11,234


5


0.9


User I/O


db file parallel write


475,780


7,760


16


0.6


System I/O

3.4 消耗时间最长的SQL语句


Elapsed Time (s)


CPU Time (s)


Executions


Elap per Exec (s)


% Total DB Time


SQL Id


SQL Text


744,943


51


226


3296.21


60.02


2d0msz9tv9z5c


DELETE FROM PUB_XXLINE WHERE U...


429,987


29


483


890.24


34.64


1yucnh7p2mjdk


DELETE FROM PUB_XXLINE WHERE S...

2d0msz9tv9z5c文本如下:

DELETE FROM PUB_XXLINE WHERE USER_ID=:1

1yucnh7p2mjdk文本如下:

DELETE FROM PUB_XXLINE WHERE SESSION_ID=:1

以上两条SQL语句产生严重行争用,并且在会话级产生死锁

3.5 数据库内验证会话死锁

(1)查看被阻塞的sid:800会话是被哪个会话所阻塞

select sid,serial#,sql_id,status,blocking_session from v$sessionwhere sid=800;


sid


serial#


sql_id


status


blocking_session


800


28777


2d0msz9tv9z5c


ACTIVE


347

从上面看来,sid:800执行的SQL语句的ID是2d0msz9tv9z5c,它被session id 347所阻塞

(2)查看session id 347是否被阻塞

select sid,serial#,sql_id,status,blocking_session from v$sessionwhere sid=347;


sid


serial#


sql_id


status


blocking_session


347


15367


2d0msz9tv9z5c


ACTIVE


800

Session 347执行的语句的ID也是2d0msz9tv9z5c,它被sid 800所阻塞,在这里已经形成死锁。

3.6 数据库日志中发现大量死锁信息


Wed Dec 10 09:55:05 2014

Global Enqueue Services Deadlock detected. More info in file

/oracle/admin/XXTH/bdump/XXth1_lmd0_1541770.trc.

Wed Dec 10 09:55:36 2014

Thread 1 advanced to log sequence 493665 (LGWR switch)

Current log# 16 seq# 493665 mem# 0: +REDOGROUP/XXth/onlinelog/group_16.263.837169415

Wed Dec 10 09:56:04 2014

Thread 1 advanced to log sequence 493666 (LGWR switch)

Current log# 14 seq# 493666 mem# 0: +REDOGROUP/XXth/onlinelog/group_14.261.837169357

Wed Dec 10 09:56:05 2014

Global Enqueue Services Deadlock detected. More info in file

/oracle/admin/XXTH/bdump/XXth1_lmd0_1541770.trc.

4、问题原因诊断总结

语句DELETEFROM PUB_XXLINE WHERE USER_ID=:1每次操作的数据行有多行,多个会话同时执行该语句,在数据库内形成死锁,并且玥塞单次删除一行数据的语句DELETEFROM PUB_XXLINE WHERE SESSION_ID=:1从而使Weblogic(中间件)的连接池消耗殆尽。无法新增连接。

本文作者:黎俊杰(网名:踩点),从事”系统架构、操作系统、存储设备、数据库、中间件、应用程序“六个层面系统性的性能优化工作

欢迎加入 系统性能优化专业群,共同探讨性能优化技术。群号:258187244

时间: 2024-08-25 10:31:01

数据库死锁严重引发中间件连接池满故障诊断的相关文章

数据库会自动清除掉超时的空闲连接造成中间件连接池中连接断开的问题

所有的数据库都会自动清除掉超时的空闲连接,因为数据库本身是一个SOCKET服务器,它必须要定时清除掉僵死连接,来保持其长时间稳定运行. 数据库清除空闲连接以后,中间件连接池里面con.connected还是等于true,也就是说在中间件里面是无法判断连接池中的连接是否已经被数据库给清除了. 事实上中间件连接池中的所有连接必须保持24小时的连接是通的.那么如何解决这个矛盾呢? 答案是在连接池中设置定时器,定时检查池中的每一个连接,当池中的空闲连接已经超过了半小时,就自动将此连接断开并重连. {**

性能测试——记weblogic 连接池满无法链接故障诊断过程

记weblogic 连接池满无法链接故障诊断过程 前段时间公司负责建行的一个票据系统在,上线前几个分行试运行环境下,每天后台日志都会报oracle.jdbc.xa.OracleXAException,前台无法正常访问 通过使用weblogic的测试数据库链接,弹出无法链接提示信息,但是发现连接池使用才10个,而最大连接数60个,监控分析没有发现连接数使用满的迹象. 那个时候我们公司的老总以及客户方项目领导非常着急,都忙着找人帮忙解决,客户方也请了他们建行自己的高手过来解决,我们公司老总也打电话四

中间件--连接池

unit untDBPool; {$I def.inc}interface uses Classes, SyncObjs, SysUtils, DateUtils, untDB, Windows, untGlobal; type TLoopThread=class(TThread) private CS: TCriticalSection; protected procedure Execute; override; public constructor Create; overload; de

JNDI连接池连接Oracle数据库

今天做了一个评论的小功能,要求用JNDI连接池连接Oracle数据库,以前只是测试了是否连接的上,现在没想到一个JNDI连接池连接Oracle数据库,纠结了好久,原来都是Oracle数据库的问题,这是过失.下面介绍一下JNDI连接池连接Oracle数据库. JNDI介绍 什么是JNDI? JNDI(Java Naming and Directory Interface,Java命名和目录接口) 是一组在Java应用中访问命名和目录服务的API 通过名称将资源与服务进行关联 什么是连接池技术? 连

几个主流的Java连接池整理

池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对象的容器,在进程初始化时创建一定数量的对象.需要时直接从池中取出一个空闲对象,用完后并不直接释放掉对象,而是再放到对象池中以方便下一次对象请求可以直接复用.其他几种池的设计思想也是如此,池技术的优势是,可以消除对象创建所带来的延迟,从而提高系统的性能. 要了解Java连接池我们先要了解数据库连接池(

连接池的概念

连接池的概念  1)连接池是一个进程 多个连接是在一个进程里面存储.管理的.这个进程保存所有的连接,当我们打开连接,如果有未用连接可用,则返回该连接.如果池中的连接都用完了,则创建一个新的连接保存到连接池.而但我们关闭连接的时候,连接池里面并不关闭连接,而是返回连接池中并标记为可重用的状态,等待重新连接直到等待超时.再次打开连接的时候,我们就可以重用上次的连接.如果在这个时间内没有连接请求(打开连接),这个数据库连接将被关闭,并从连接池中移除这个连接实例.如果池中连接到达了最大连接数,请求进入等

几个主流java连接池

池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对象的容器,在进程初始化时创建一定数量的对象.需要时直接从池中取出一个空闲对象,用完后并不直接释放掉对象,而是再放到对象池中以方便下一次对象请求可以直接复用.其他几种池的设计思想也是如此,池技术的优势是,可以消除对象创建所带来的延迟,从而提高系统的性能. 要了解Java连接池我们先要了解数据库连接池(

《java数据源—连接池》

<java数据源-连接池>1.数据源的分类:直接数据源.连接池数据源.2.连接池.数据源.JNDI a.数据源:Java中的数据源就是连接到数据库的一条路径,数据源中并无真正的数据,它仅仅记录的是你连接到哪个数据库,以及如何连接. b.连接池:简单的说就是保存所有的数据库连接的地方,在系统初始化时,将数据库连接对象存储到内存里,当用户需要访问数据库的时候,并不是建立一个新的连接,而是从连接池中 取出一个已经建立好的空闲连接对象.而连接池负责分配.管理.释放数据库连接对象.注意的是:连接池是由容

DBCP、C3P0、Proxool 、 BoneCP开源连接池的比较

 简介   使用评价  项目主页  DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用 可以设置最大和最小连接,连接等待时间等,基本功能都有,此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性有所下降,此外不提供连接池监控 http://homepages.nildram. co.uk/~slink/java/DBPool/  C3P0  C3P0是一个开放源代码的JDBC连接池,它在lib目录