oracle中會話的狀態

alei_1304發表於2013-05-23

我們可以通過oracle檢視v$session來檢視當前資料庫中的所有會話資訊,其中該檢視有一列為status標誌會話狀態,oracle官方文件對這一列定義如下

STATUS
VARCHAR2(8) Status of the session:
ACTIVE - Session currently executing SQL

INACTIVE

KILLED - Session marked to be killed

CACHED - Session temporarily cached for use by Oracle*XA

SNIPED - Session inactive, waiting on the client

 

通過我們遇到的都是ACTIVE,INACTIVE,KILLED三種狀態

1、active 會話處於活動狀態,當前session正在執行sql語句

2、inactive會話處於不活動狀態,sql語句已經執行完畢,但是由於某種原因,會話和後臺程式沒有釋放,通過我們在sqlplus中退出和類似plsql developer工具log out或者直接退出,都是直接關閉會話,而不是將會話置於inactive狀態,下面以sqlplus命令為例

[oracle@oracle11g ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Thu May 23 23:09:30 2013

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select count(*) from v$process;

  COUNT(*)
----------
        30

SQL>

開啟另一會話視窗,查詢會話數量

SQL>select count(*) from v$session;

查詢結果是27個會話

我們退出之前的會話

SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@oracle11g ~]$

再次查詢會話數量,結果是26。說明會話已經釋放。而通常情況下inactive會話比較多的情況下是我們採用jboss,weblogic之類的中介軟體,建立連線池,而連線使用完畢之後並未釋放連線,仍然將連線放回到連線池的情況。

我本機上採用weblogic連線池,連線到oracle,設定初始連線數量是5,我們通過查詢

SQL> set linesize 150
SQL> select s.SID,s.SERIAL#,s.OSUSER,s.USERNAME,s.STATUS,s.PROGRAM from v$session s where s.STATUS='INACTIVE' and s.USERNAME='TEST';

       SID    SERIAL# OSUSER                         USERNAME                       STATUS   PROGRAM
---------- ---------- ------------------------------ ------------------------------ -------- ------------------------------------------------
        16         64 Administrator                  TEST                           INACTIVE JDBC Connect Client
        21         28 Administrator                  TEST                           INACTIVE JDBC Connect Client
       141        164 Administrator                  TEST                           INACTIVE JDBC Connect Client
       142         93 Administrator                  TEST                           INACTIVE JDBC Connect Client
       145         30 Administrator                  TEST                           INACTIVE JDBC Connect Client
由於會話的建立和釋放都需要耗費一定的資源,應用端往往會通過連線池來快取會話。如果inactive會話過多,不建議直接kill session,畢竟應用的穩定性是第一位的,可以考慮調整應用連線池的數量,或者考慮增加processes的數量。

3、killed處於此狀態的會話,被標註為刪除,表示出現了錯誤,正在回滾

當然,也是佔用系統資源的。還有一點就是,killed的狀態一般會持續較長時間,而且用windows下的工具pl/sql developerkill掉,是不管用的,要用命令:alter system kill session 'sid,serial#' ; 可以通過此方式來解除死鎖

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7483882/viewspace-761887/,如需轉載,請註明出處,否則將追究法律責任。

相關文章