connection session process的聯絡與區別

ylfxml發表於2011-05-16

連線並不是會話的同義詞,發現這一點時很多人都很詫異。在大多數人眼裡,它們都是一樣的,但事實上並不一定如此。在一條連線上可以建立0個、一個或多個會話。各個會話是單獨而且獨立的,即使它們共享同一條資料庫物理連線也是如此。一個會話中的提交不會影響該連線上的任何其他會話。實際上,一條連線上的各個會話可以使用不同的使用者身份!
Oracle中,連線只是客戶程式和資料庫例項之間的一條特殊線路,最常見的就是網路連線。這條連線可能連線到一個專用伺服器程式,也可能連線到排程器。如前所述,連線上可以有0個或多個會話,這說明可以有連線而無相應的會話。另外,一個會話可以有連線也可以沒有連線。使用高階Oracle Net特性(如連線池)時,客戶可以刪除一條物理連線,而會話依然保留(但是會話會空閒)。客戶在這個會話上執行某個操作時,它會重新建立物理連線。下面更詳細地定義這些術語:
? 連線(connection):連線是從客戶到Oracle例項的一條物理路徑。連線可以在網路上建立,或者透過IPC機制建立。通常會在客戶程式與一個專用伺服器或一個排程器之間建立連線。不過,如果使用Oracle的連線管理器(Connection Manager ,CMAN),還可以在客戶和CMAN之間以及CMAN和資料庫之間建立連線。CMAN的介紹超出了本書的範圍,不過Oracle Net Services Administrator’s Guide(可以從免費得到)對CMAN有詳細的說明。
? 會話(session):會話是例項中存在的一個邏輯實體。這就是你的會話狀態(session state),
也就是表示特定會話的一組記憶體中的資料結構。提到“資料庫連線”時,大多數人首先想到的就是“會話”。你要在伺服器中的會話上執行SQL、提交事務和執行儲存過程。

簡單地說,連線和會話之間有一種多對多的關係。不過,最常見的是專用伺服器與單一會話之間的一對一關係,這也是大多數人每天所看到的情況。

A process is a physical process or thread.

On unix, you can see a process with "ps" for example. It is there.

There are many types of processes in Oracle -- background processes like SMON, PMON,
RECO, ARCH, CKPT, EMNn, DBWR, etc..... And user processes like dedicated servers or
shared server (multi-threaded server -- aka MTS -- configuration)

每個sql login稱為一個連線(connection),而每個連線,可以產生一個或多個會話,如果資料庫執行在專用伺服器方式,一個會話對應一個伺服器程式(process),

如果資料庫執行在共享伺服器方式,一個伺服器程式可以為多個會話服務。

在dedicated server機器上的測試如下:
資料庫的session和作業系統process是對應的。
這表示一個session對應一個process,但是一個process未必對應一個session。
大家可以透過SELECT spid
FROM v$process
WHERE NOT EXISTS ( SELECT 1
FROM v$session
WHERE paddr = addr); 檢視

SQL> select count(*) from v$process;
COUNT(*)
----------
53
SQL> select count(*) from v$session;
COUNT(*)
----------
50

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7548/viewspace-1049940/,如需轉載,請註明出處,否則將追究法律責任。

相關文章