對Oracle中鏈接和會話的含義,老是有些模糊,參考TOM大叔的《Oracle編程藝術》,從新整理了下知識點。
sql
在Oracle中,「鏈接」不是「會話」的同義詞,一個鏈接上能夠建立0個、1個或多個會話,多個獨立的會話能夠經過一個鏈接關聯在一塊兒,甚至能夠獨立於鏈接存在(無鏈接),各個會話之間是獨立的,即便他們共享數據庫上的同一個物理鏈接亦是如此。一個鏈接上的各個會話能夠屬於不一樣的數據庫用戶。
數據庫
鏈接,connection,能夠說是客戶端進程和數據庫實例之間的一條物理路徑,例如網絡鏈接、IPC,這個鏈接可能鏈接到一個專用服務器進程(dedicated server),或者是一個調度器進程(shared server)。
編程
會話,session,是數據庫中的一個邏輯實體,客戶端進程能夠經過他在數據庫中執行SQL等操做,你所看到的會話狀態信息,表明了你的會話在實例內存中的數據結構的集合,會話是在數據庫上執行SQL、提交事務和運行存儲過程的地方。服務器
導圖,
微信
咱們經過實驗,更直觀地來看鏈接和會話的區別和聯繫。網絡
sqlplus登陸數據庫,能夠看到這是個和專用服務器鏈接的會話,其中PADDR是這個專用服務器進程的地址,session
SQL> select username, sid, serial#, server, paddr, status
2 from v$session
3 where username = USER;
USERNAME SID SERIAL# SERVER PADDR STATUS
------------------------------ ---------- ---------- --------- ---------------- --------
BISAL 131 8681 DEDICATED 000000009F4BEB30 ACTIVE
如今打開autotrace看下執行語句的統計結果,能夠看到,此時有了兩個會話了,從他們的PADDR的值,能推測這兩個會話都使用同一個專用服務器進程,由於咱們是測試,因此當前操做系統中只啓動了一個進程(sqlplus),沒建立新的進程,即兩個會話,只使用了一個鏈接。再看下會話狀態,一個是ACTIVE,一個是INACTIVE,ACTIVE的會話正在執行SQL,INACTIVE的會話(autotrace的會話)是「監視」實際的會話,報告他作了什麼,
數據結構
SQL> set autotrace on statistics
SQL> select username, sid, serial#, server, paddr, status
2 from v$session
3 where username = USER;
USERNAME SID SERIAL# SERVER PADDR STATUS
------------------------------ ---------- ---------- --------- ---------------- --------
BISAL 131 8681 DEDICATED 000000009F4BEB30 ACTIVE
BISAL 132 3625 DEDICATED 000000009F4BEB30 INACTIVE
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
993 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2 rows processed
之因此啓動了新的會話來「監視」執行語句的會話,主要由於若是在同一個會話中觀察統計信息,就會對統計信息形成影響,畢竟觀察統計信息的操做,也要進行排序、消耗I/O以及網絡傳輸數據等。
oracle
爲了清除會話,咱們執行disconnect,此時並未真正物理地斷開鏈接,
app
SQL> disconnect
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select * from dual;
SP2-0640: Not connected
查看v$session顯示用戶BISAL未創建任何鏈接,但使用剛纔獲得的專用服務器進程地址(PADDR)能看到存在一個進程,有一個物理鏈接,所以,這就有了一條沒有關聯會話的鏈接,
SQL> select * from v$session where username = 'BISAL';
no rows selected
SQL> select username, program
2 from v$process
3 where addr = hextoraw('000000009F4BEB30');
USERNAME PROGRAM
--------------- ------------------------------------------------
oracle oracle@DEPDBBAK1 (TNS V1-V3)
使用connect在這個沒有會話的進程上建立一個新會話,能夠看到出現了新的會話,而且PADDR仍是以前的,說明用的仍是原來的專用服務器進程,這個新會話仍是在同一個物理鏈接,SID是否相同,這個待定,取決於disconnect時是否有別人登陸,以及原來的SID是否可用,
SQL> conn bisal/bisal
Connected.
SQL> select username, sid, serial#, server, paddr, status
2 from v$session
3 where username = USER;
USERNAME SID SERIAL# SERVER PADDR STATUS
------------------------------ ---------- ---------- --------- ---------------- --------
BISAL 131 8683 DEDICATED 000000009F4BEB30 ACTIVE
以上測試,說明了使用專用服務器進程的鏈接下,「鏈接」和「會話」,證實了一個鏈接上能夠建立0個、1個或多個會話,科學仍是嚴謹的,因此對待一些專業的術語,仍是瞭解清楚,更有助咱們對原理的把控。
本文分享自微信公衆號 - bisal的我的雜貨鋪(gh_e8769c7350b1)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。