今天一位客户说应用运行比较慢,让我看看数据库中锁的相关情况。
那么如何快速的找到持有锁的会话相关信息呢?
请参考如下SQL:
SET LINES 130;
COLUMN sid_ser format a12 heading 'session,|serial#';
COLUMN username format a12 heading 'os user/|db user'; COLUMN process format a9 heading 'os|process';
COLUMN spid format a7 heading 'trace|number';
COLUMN owner_object format a35 heading 'owner.object'; COLUMN locked_mode format a13 heading 'locked|mode'; COLUMN STATUS format a8 heading 'status';
spool coe_locks.lst;
SELECT
substr(to_char(l.session_id)||','||to_char(s.serial#),1,12) sid_ser, substr(l.os_user_name||'/'||l.oracle_username,1,12) username, l.process,
p.spid,
substr(o.owner||'.'||o.object_name,1,35) owner_object, decode(l.locked_mode,
1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Excl', 6,'Exclusive',NULL) locked_mode,
substr(s.STATUS,1,8) STATUS FROM
v$locked_object l, all_objects o, v$session s, v$process p
WHERE
l.object_id = o.object_id
AND l.session_id = s.sid AND s.paddr = p.addr AND s.STATUS != 'KILLED';
spool off;
在结果中PROCESS字段的1234代表的意思,请看如下解释:
JDBC Thin驱动程序本身无法正确检索某些 V$SESSION 属性的值。 具体来说,驱动程序表现出以下行为:
1.当使用JDBC Thin驱动程序查询 V$SESSION 表的TERMINAL字段时,返回的值为“未知”。
2.使用JDBC Thin驱动程序查询 V$SESSION 表的PROCESS字段时,返回的值为“1234”。 由于无法使用JDBC Thin驱动程序获取进程ID,因此驱动程序默认将进程ID返回为“1234”。
处于inactive 状态的会话表示语句已经执行完成。inactive对数据库本身没有什么影响,但如果程序没有及时commit,那么长时间持有相关的锁不释放,就会带来相应的阻塞问题。
当客户端发出应用程序连接请求时,将与数据库服务器建立JDBC连接。 JDBC连接池旨在具有到数据库的开放JDBC连接的服务器场所,可以由应用程序借用。从性能角度来看,这是更有效的,因为它每次都节省打开和关闭JDBC连接的时间。但是,这意味着当系统中的活动很少时,连接可以长时间闲置。大多数连接将大部分时间都花在连接池中,等待Java线程打开它们,或者等待Java线程对数据进行处理,或者等待网络在计算机之间传输数据。这意味着在任何给定时间点,将有相当数量的数据库连接,其中V $ SESSION中的STATUS为“ INACTIVE”。那是完全正常的。
但是,重要的是要验证打开的连接数没有稳定增加,这表明连接泄漏会阻止这些连接被重用并导致达到最大连接数。
引用:
- Understanding Inactive or Stale Sessions From JDBC Connection Pool (Doc ID 1641167.1)
- https://docs.oracle.com/cd/B28359_01/java.111/e10788/optimize.htm#CFHHCICE
- https://docs.oracle.com/cd/B28359_01/java.111/e10788/connect.htm#CHDIDJGH
Speak Your Mind