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有詳細的說明。


  * 會話(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


  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


  USERNAME SID SERIAL# SERVER PADDR STATUS


  ------------------------------ ---------- ---------- --------- -------- --------


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


原文出自【比特網】,轉載請保留原文鏈接:http://soft.chinabyte.com/database/386/12228886.shtml
發佈了16 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章