在共享服務器體系結構中,一個dispatcher分派器將傳入網絡的多個會話請求定向到一個共享服務器進程池,消除了為每個連接分配一個專用服務器進程的需要。作為一般的指導原則,僅當系統需要並發連接到數據庫的數量超過操作系統的處理能力時,才能使用共享服務器。
共享服務器模式必須使用net services.也就是必須配置tns信息(即使客戶端與服務端為同一台機器,也要配置TNS,且通過IPC協議進行通訊)。它適合用於高並發,事務量小,如果此時采用了共享模式,可以大大減少由於高度並發對於ORACLE服務器的資源消耗。
1,共享服務器模式優缺點
優點:
(1)減少了實例中的進程數
(2)增加了更多並發用戶的數量
(3)實現動態負載均衡
(4)減少了空閑服務器進程數量
(5)減少了實例PGA內存
缺點:
(1)共享服務器的代碼路徑比專用服務器長,所以它天生就比專用服務器慢;
(2)存在人為死鎖的可能,因為它是串行的,只要一個連接阻塞,則該服務器進程上的所有用戶都被阻塞,並且極可能死鎖;
(3)存在獨占事務的可能,因為如果一個會話的事務運行時間過長,它獨占共享資源,其它用戶只能等待,而專用服務器,每個客戶端是一個會話;
(4)共享服務器模式限制了某些數據庫特性,例如:不能單獨啟動和關閉實例,不能進行介質恢復。
2,在共享服務器體系結構中需要的進程
(1)將客戶端進程連接放到 dispatcher 或者 專有服務器進程的 網絡監聽器(PS:監聽器是Oracle網絡服務的一分部,而不是Oracle數據庫的一部分)。
(2)一個或多個分派器進程(Dnnn)
(3)一個或多個共享服務器進程(Snnn)
3,請求處理流程
分派器將請求放入請求隊列,然后共享服務器進程檢查公共請求隊列並取出處理,最后服務器進程將響應結果置於分派器的響應隊列。(每一個分派器都有一個響應隊列)
4,分派器進程(Dnnn)
分派器進程使得客戶端進程可以共享數量有限的服務器進程。可以為單個數據庫實例創建多個分派器進程。分派器進程的最佳個數取決於操作系統的限制和每個進程的連接數。
當客戶端進程發出連接請求時,監聽器將確定客戶端進程是否應使用共享服務器進程,這個在配置文件里面有配:


○ 如果明確配置的是server = shared 並且建立了和dispatcher的通信,則使用共享服務器模式。
○ 如果配置的是server = shared但是無法建立和任何dispatcher的通信,或者配置的是server = dedicated,則使用專有服務器模式。
一個典型的實例分派器設置如下(參數文件中設置):
dispatchers="(protocol=TCP)(serv=orcl)(list=orcl)(poo=on)(disp=5)(conn=33)(sess=224)"
protocol=tcp--協議
list=orcl--監聽器別名,並非監聽器的名字,實際是一個tnsnames.ora中的網絡服務名
serv=orcl--網絡服務名
poo=on--是否啟用共享池
disp=5--初始調度進程數
sess=224--每個調度進程的最大會話數
max_dispatchers=19--最大調度進程的數
通過v$dispatcher視圖可以查看數據庫實例目前存在多少個調度器進程(分派器):select * from v$dispatcher;
修改調度進程數量:alter system set dispatchers="(protocol=tcp)(disp=6)" scope=both;
也可以手動的殺掉一個指定的調度器進程:ALTER SYSTEM SHUTDOWN IMMEDIATE 'D000';
5,共享服務器進程(Snnn)
在共享服務器配置中,每個共享服務器進程為多個客戶端請求服務。除了共享服務器進程不與特定客戶端進程相關聯外,共享服務器進程和專用服務器進程提供相同的功能。
(1)共享服務進程的設置主要受三個參數的影響:
○ shared_servers
指定了當instance啟動的時候share_servers啟動的數量(可通過shared server process查看),不要將這個參數設置得太大,否者啟動數據庫instance的時候就會花更多時間,Oracle啟動過后會根據負載來動態調整shared_servers。如果為0,表示數據庫沒有啟動共享服務模式。這個參數是配置shared server必須的,而且只有這個參數是必須的。
修改參數: alter system set shared_servers=1;
○ max_shared_servers
ORACLE在同一個時刻最大能夠使用的share_servers數量,不要將這個參數設置小於shared_servers,如果動態修改shared_servers大於max_shared_servers,ORACLE會覆蓋max_shared_servers的值,此時你需要修改max_shared_servers,同時也不能大於processes的值。這個參數是為了給占用很大資源操作而設的(批處理),為了預留一些process給DBA任務(rman備份)。
○ shared_server_sesions:
指定了總共允許的的shared server session的數量。如果設置了這個參數,那么就不要將這個值超過sessions,如果沒有設置這個值,那么只要還有空閑的session,就可以被使用。設置這個值是為專有連接預留user sessions的。
(2)把服務器從共享服務器模式改為專用服務器模式
alter system set shared_servers = 0 scope = both; --已經存在的共享進程需要等到會話結束才能結束
或
alter system set max_share_servers=0 scope=both; --立即強制結束所有共享服務器進程
6,判斷當前session的連接模式
數據庫可以同時支持共享服務器連接和專用服務器連接。因此如果參數shared_servers=0 ,可以確定所有連接均是專用模式。但是如果shared_servers>0,那么就需要通過v$session視圖的SERVER字段來進一步判斷當前連接模式了。
補充:Oracle11gR2安裝后初始設置shared_servers=1;同時,數據庫還創建了一個調度器進程,在參數文件中有如下配置:dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)',service "orclXDB"是Oracle9i后創建數據庫時默認包含的XML DB特性,提供http、ftp等服務。通過lsnrctl service可以查看監聽器監聽的網絡服務:(orclXDB是Oracle網絡體系中的一個服務,而不是操作系統層面的服務)
