Oracle中連接與會話的區別

1.oracle中文概念手冊

連接 (connection)與會話 (session)這兩個概念均與用戶進程 (user process)緊密相關,但二者又具有不同的含義。

連接 :用戶進程和 Oracle 實例間的通信通道(communication pathway)。這個通信通道是通過進程間的通信機制(interprocess communication mechanisms)(在同一個計算機上運行用戶進程和 Oracle 進程)或網絡軟件(network software)(當數據庫應用程序與 Oracle 服務器運行在不同的計算機上時,就需要通過網絡來通信)建立的。

會話 :用戶通過用戶進程與 Oracle 實例建立的連接[此處連接與上文中的連接含義不同 ,主要指用戶和數據庫間的聯繫 ]。例如,當用戶啓動 SQL*Plus 時必須提供有效的用戶名和密碼,之後 Oracle 爲此用戶建立一個會話。從用戶開始連接到用戶斷開連接(或退出數據庫應用程序)期間,會話一直持續。

Oracle 數據庫中的同一個用戶可以同時創建多個會話。例如,用戶名/密碼爲的SCOTT/TIGER 用戶可以多次連接到同一個 Oracle 實例。

當系統沒有運行在共享服務模式下時,Oracle 爲每個用戶會話創建一個服務進程(server process)。而當系統運行在共享服務模式下時,多個用戶會話可以共享同一個服務進程。

2.通過實例理解(備註此實力來源於http://hi.baidu.com/bystander1983/blog/item/7201a3835d1961ab0cf4d294.html)

有A/B兩個城市,需要從A運送白菜 到B城

先建一條公路
然後運送白菜過去,包括準備白菜和運送白菜以及返回等一系列的動作。

一條公路,可以運送0-n次的白菜
當然從A到B的公路也可能不只一條
某一次運送白菜,可以在真正上路時纔開通某一條道路
一次運送不會影響別的運送的狀態


對應數據庫
A代表客戶端進程
B代表服務器端進程
公路代表連接
運送一次白菜代表一個會話

一個連接可以進行多次的會話
一個會話可以不依賴於某個連接,甚至沒有連接(當我準備好了,真正開始運送時再建立連接)
一個會話不會影響別的會話

3 來源於(http://book.51cto.com/art/200707/51921.htm)

連接並不是會話的同義詞。一個連接可能有零個、一個或多個建立在其上的會話。每個會話是分開且獨立的,即使他們共享一個同樣的物理連接到數據庫。會話中的某個提交併不影響在該連接上的任何其他會話。事實上,使用該連接的每個會話可以使用不同用戶身份。在Oracle中,一個連接是一個在客戶端進程與數據庫實例之間的物理線路——網絡連接。該連接可能是一個專用服務器進程或一個調度進程。一個連接可以有零個或更多的會話,即一個連接的存在並不一定伴隨着對應的會話存在。另外,一個會話不一定有連接。一個物理連接可以被客戶端刪除,只保留一個空閒會話。當客戶端要在該會話中完成一些操作時,就需要重新建立物理連接。
  •連接:一個連接是一個從客戶端到一個數據庫實例的物理通道。一個連接或者通過網絡或者通過IPC機制建立連接。最典型的連接是建立在客戶端進程和專用服務器或共享服務器之間。然而,使用Oracle的連接管理器(CMAN)時,一個連接可以是在客戶端與CMAN之間或CMAN與數據庫之間。
  •會話:一個會話是存在於實例中的邏輯實體。它是一個表示唯一會話的內存數據結構的集合,用於執行SQL、提交事務並運行服務器中存儲過程等。
實際上,一個連接有多個會話是非常普遍的。使用SQL*Plus可以說明連接和會話間的區別。使用autotrace命令時可產生兩個會話。通過一個使用單個進程的連接也可以建立兩個會話。首先,執行以下操作。

SQL>select username,sid,serial#,server,paddr,status
from v$session
where username=USER
/
USERNAME SID SERIAL#SERVER PADDR STATUS
----------- --- ------ ------ ------------ -----
OPS$TKYTE 153  3196  DEDICATED AE4CF614 ACTIVE

其中,user是系統函數,結果爲當前連接數據庫的用戶。目前結果顯示的是一個單獨連接專用服務器的會話。PADDR列是唯一的專用服務器進程的地址。
其次,打開autotrace,來查看在SQL*Plus中執行語句的統計數據。

SQL>set autotrace on statistics
SQL>select username,sid,serial#,server,paddr,status
from v$session
where username=USER
/   

這樣,就打開了兩個會話,但是兩者都使用一個專用服務器進程。查詢結果顯示它們都有相同的PADDR列值。因此,兩個會話使用一個進程,即單個連接。注意,其中一個會話,即最初的會話(SQL*Plus),是處於主動(active)狀態。該會話運行查詢顯示結果信息。但另外一個處於被動狀態(inactive)的會話就是autotrace會話,其職責是監視第一個會話並報告該會話所做的一切。
在SQL*Plus中打開autotrace後,當執行DML操作(insert、update、delete、select和merge)時,SQL*Plus將完成下列操作。
1)如果第二個會話不存在,則使用當前連接創建一個新的會話。
2)SQL*Plus要求產生的新會話查詢v$sesstat視圖,爲運行DML的會話記錄初始統計數據。
3)在第一個會話中運行DML操作。
4)在完成DML語句後,SQL*Plus 將要求其他會話再次查詢V$sesstat併產生顯示執行DML會話在統計數據上的差異報告。
如果關閉autotrace,SQL*Plus將終止第二個會話並不再監視v$session視圖。

發佈了6 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章