显示Oracle数据库表或行上持有锁的所有会话




  • 今天一位客户说应用运行比较慢,让我看看数据库中锁的相关情况。

    那么如何快速的找到持有锁的会话相关信息呢?

    请参考如下SQL:

    SET term ON;
    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”。那是完全正常的。
    但是,重要的是要验证打开的连接数没有稳定增加,这表明连接泄漏会阻止这些连接被重用并导致达到最大连接数。

    引用:

    1. Understanding Inactive or Stale Sessions From JDBC Connection Pool (Doc ID 1641167.1)
    2. https://docs.oracle.com/cd/B28359_01/java.111/e10788/optimize.htm#CFHHCICE
    3. https://docs.oracle.com/cd/B28359_01/java.111/e10788/connect.htm#CHDIDJGH

    Speak Your Mind

    *