在Oracle中,鏈接只是客戶進程和數據庫實例之間的一條特殊線路,最多見的就是網絡鏈接。這條鏈接可能鏈接到一個專用服務器進 程,也可能鏈接到調度器。如前所述,鏈接上能夠有0個或多個會話,這說明能夠有鏈接而無相應的會話。另外,一個會話能夠有鏈接也能夠沒有鏈接。使用高級 Oracle Net特性(如鏈接池)時,客戶能夠刪除一條物理鏈接,而會話依然保留(可是會話會空閒)。客戶在這個會話上執行某個操做時,它會從新創建物理鏈接。下面 更詳細地定義這些術語:* 鏈接(connection):鏈接是從客戶到Oracle實例的一條物理路徑。鏈接能夠在網絡上創建,或者經過IPC機制創建。一般會在客戶進程與一個 專用服務器或一個調度器之間創建鏈接。不過,若是使用Oracle的鏈接管理器(Connection Manager ,CMAN),還能夠在客戶和CMAN之間以及CMAN和數據庫之間創建鏈接。CMAN的介紹超出了本書的範圍,不過Oracle Net Services Administrator‘s Guide(能夠從http://otn.oracle.com免費獲得)對CMAN有詳細的說明。 sql
* 會話(session):會話是實例中存在的一個邏輯實體。這就是你的會話狀態(session state),也就是表示特定會話的一組內存中的數據結構。提到「數據庫鏈接」時,大多數人首先想到的就是「會話」。你要在服務器中的會話上執行SQL、提交事務和運行存儲過程。 數據庫
可使用SQL*Plus來看一看實際的鏈接和會話是什麼樣子,從中還能夠了解到,實際上一條鏈接有多個會話的狀況至關常見。這裏使用了 AUTOTRACE命令,並發現有兩個會話。咱們在一條鏈接上使用一個進程建立了兩個會話。如下是其中的第一個會話:sqlplus "storm/unimas" SQL> select username, sid, serial#, server, paddr, status from v$session where username = 'STORM';USERNAME SID SERIAL# SERVER PADDR STATUS 服務器
------------------------------ ---------- ---------- --------- -------- -------- 網絡
STORM 148 60 DEDICATED 30A1BDCC INACTIVE session
SQL> set autotrace on statistics SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled SP2-0611: Error enabling STATISTICS report SQL> 數據結構
碰到錯誤,原來是沒有添加PLUSTRACE role sqlplus "sys/unimas as sysdba" SQL> create role plustrace;Role created. SQL> grant select on v_$sesstat to plustrace;Grant succeeded. SQL> grant select on v_$statname to plustrace;Grant succeeded. SQL> grant select on v_$mystat to plustrace;Grant succeeded. SQL> grant plustrace to dba with admin option;Grant succeeded. SQL> grant plustrace to STORM;Grant succeeded. 併發
從新登陸storm SQL> set autotrace on statistics oracle
USERNAME SID SERIAL# SERVER PADDR STATUS ide
------------------------------ ---------- ---------- --------- -------- -------- ui
STORM 141 180 DEDICATED 30A1BDCC INACTIVE STORM 148 62 DEDICATED 30A1BDCC INACTIVE
SQL> disconnect
從技術上講,這個命令應該叫DESTROY_ALL_SESSIONS更合適,而不是DISCONNECT,由於咱們並無真正物理地斷開鏈接。
在SQL*Plus中要真正地斷開鏈接,應該執行「exit」命令,由於你必須退出才能徹底撤銷鏈接。
SQL> select username, sid, serial#, server, paddr, status from v$session where username = 'STORM';no rows selected
能夠看到,這個帳戶名下沒有會話,可是仍有一個進程,相應地有一條物理鏈接(使用前面的ADDR值)
SQL> select username, program from v$process where addr = hextoraw('30A1BDCC');
USERNAME PROGRAM
--------------- ------------------------------------------------
oracle oracle@hb (TNS V1-V3)
SQL>因此,這就有了一條沒有相關會話的「鏈接」。可使用SQL*Plus的CONNECT命令(這個命令的名字也起得不恰當),在 這個現有的進程中建立一個新會話(CONNECT命令叫CREATE_SESSION更合適):能夠看到,這個帳戶名下沒有會話,可是仍有一個進程,相應 地有一條物理鏈接(使用前面的ADDR值)
SQL> select username, sid, serial#, server, paddr, status from v$session where username = 'STORM';
USERNAME SID SERIAL# SERVER PADDR STATUS
------------------------------ ---------- ---------- --------- -------- --------
STORM 153 58 DEDICATED 30A1BDCC INACTIVE
能夠注意到,PADDR仍是同樣的,因此咱們仍是在使用同一條物理鏈接,可是(可能)有一個不一樣的SID.我說「可能有」,是由於也許還會分配一樣的SID,這取決於在咱們註銷時是否有別人登陸,以及咱們原來的SID是否可用。
另外:Serial# is in v$session. It is an Oracle generated value used in combination with the SID to create a unique session identifier. SID和SERIAL合起來能做爲一個session的惟一標識。