在論壇上遇見過很多人問起如何判斷oracle是共用模式還是專用模式.以前自己也對這個問題迷茫過.google下發現不少好東西.特做個筆記便於理解和記憶.
專用伺服器:一個用戶端串連對應一個伺服器處理序
共用伺服器:多個用戶端串連對應一個伺服器處理序,伺服器端存在一個進程調度器來管理。
Oracle預設用的是專用伺服器模式,Oracle可以同時支援共用伺服器和專用伺服器模式,可以指定一個會話使用專用伺服器,另一個會話使用共用伺服器。
共用伺服器具有以下一些缺點:
1)共用伺服器的代碼路徑比專用伺服器長,所以它天生就比專用伺服器慢。
2)存在人為死結的可能,因為它是串列的,只要一個串連阻塞,則該伺服器處理序上的所有使用者都被阻塞,並且極可能死結。
3)存在獨佔事務的可能,因為如果一個會話的事務已耗用時間過長,它獨佔共用資源,其它使用者只能等待,而專用伺服器,每個用戶端是一個會話。
4)共用伺服器模式限制了某些資料庫特性,例如:不能單獨啟動和關閉執行個體,不能進行介質恢複,不能使用Log Miner,並且SQL_TRACE沒有意義(因為是共用而不是當前會話的)。
MTS減少的記憶體實際上是專用伺服器模式下每個使用者串連到作業系統進程所需的記憶體,但它卻使用SGA的Large_Pool來分配UGA,拆東牆補西牆,所減少的記憶體是很少的。
如果使用者會話的串連和斷開很頻繁,資料庫進程的建立和刪除的開銷會非常大,這種情況最好採用共用伺服器模式(否則,應該使用串連池技術)。
如果用戶端一次串連終身使用(會話生命週期內),使用共用伺服器模式的意義不大。因為大部分時間,一個會話就串連到一個伺服器處理序,無法共用伺服器處理序。
判斷oracle是共用模式還是專用模式有以下方法:
1) show parameter shared_server; (註:8i應為:show parameter mts_servers;)
如果數值> 0 ,就是enable了共用伺服器.
2).在配置為共用伺服器的情況,Client可以用共用伺服器或者專用伺服器來聯結資料庫,這個參數的控制是在tnsnames.ora裡設定的。如:
aaaa=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = aaaa)(PORT = 1521))
)
(CONNECT_DATA =
(SID = aa)
(SERVER =DEDICATED)
)
)
用DEDICATED方式串連DB.
另外,Background process ,以及通過本地串連進來的,只能是DEDICATED .比如說sqlplus user/pass形式
如果DB沒有配置共用伺服器,那麼Client只能以DEDICATED方式串連DB.
3)判斷一個已經串連的session的串連方式
a)select server from v$session where ...
如果server = 'DEDICATED'則是DEDICATED方式
server='SHARED'則是shared方式,並且正有shared_server_process為其服務
server='NONE'的話,則是shared方式,並且當前沒有shared_server_process為其服務
b)僅用於Unix底下,似乎windown不行
串連v$session, v$process看process中的program
select p.program,s.server from v$session s , v$process p where s.paddr = p.addr
如果program為...(S0NN)的,則是shared方式,並且正有shared_server_process為其服務
如果program為...(D0NN)的,則是shared方式,並且當前沒有shared_server_process為其服務
如果program為其它的,則是'DEDICATED'方式