这几天新上线项目的WebLogic频繁出现线程阻塞的状况,致使客户端连接超时,影响正常业务办理。开始觉得遇到了WebLogic的bug,针对相关问题修复补丁后问题依然,因而开始考虑是否数据库部分有问题,由于每次线程阻塞都与oracle的操做有关。今天再次出现阻塞问题时,查询了一下数据库锁,发现确实存在数据库锁,开始怀疑应用中存在问题SQL。因业务不能长时间停滞,故重启WebLogic解决故障后,检查应用中锁涉及的相关SQL语句,未发现问题SQL。因而搜集一番SQL语句,以备再次出现问题时,经过session的sid查询出问题SQL的所在。sql
下述SQL语句一部分是从网上陆陆续续找到的,一部分是从oracle书籍中翻到到,整理在这里。数据库
两个查询数据库锁的SQL,第一个显示了锁对应的对象都有什么,好比表名。第二个显示的信息更多些,好比说锁什么时间开始的,当前的状态为什么等等。下述SQL须要具备DBA角色的用户进行查询。select b.owner,b.object_name,l.session_id,l.locked_mode
from v$locked_object l, dba_objects b
where b.object_id=l.object_id;
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;session
-- 查询会话ID
select username,sid,serial# from v$session;oracle
-- 查询spid
select pro.spid
from v$session ses,v$process pro where ses.sid=xxx and ses.paddr=pro.addr;线程
-- 查询会话对应sql
SELECT SE.sid,
SE.serial#,
PR.spid,
SE.status,
SUBSTR(SE.program, 1, 10) PROG,
SUBSTR(SE.machine, 1, 10) MACH,
SQ.sql_text
FROM v$session SE, v$sqlarea SQ, v$process PR
WHERE SE.paddr = PR.ADDR(+)
AND SE.sql_address = SQ.address(+)
AND schemaname <> 'SYS'
ORDER BY SE.sid对象
-- 查询v$session_wait获取各进程等待事件进程
select sid, event,p1, p1text from v$session_wait;事件
-- 经过已知的session的sid联合v$session、v$sqltext视图得到相关session正在执行的完整的SQL语句hash
select a.sql_text from v$sqltext a, v$session b
where a.hash_value=b.sql_hash_value
and b.sid='102';it
-- 检查SQL的执行计划 此SQL须要使用执行SQL的用户进行检查
set autotrace trace explain;
此处写入执行的相关SQL,回车,即会显示SQL的执行计划。