Oracle數據庫鏈接和會話的區別

 鏈接並非會話的同義詞,發現這一點時不少人都很詫異。在大多數人眼裏,它們都是同樣的,但事實上並不必定如此。在 一條鏈接上能夠創建0個、一個或多個會話。各個會話是單獨並且獨立的,即便它們共享同一條 數據庫物理鏈接也是如此。一個會話中的提交不會影響該鏈接上的任何其餘會話。實際上,一條鏈接上的各個會話可使用不一樣的用戶身份!

  在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的惟一標識。

相關文章
相關標籤/搜索