主要參考文檔:http://www.itpub.net/thread-1714191-1-1.html
Dedicated mode下,客戶端每發來一個連接請求,數據庫都要給這個請求建立一個服務進程來完成響應。而在shared mode下,oracle會首先建立一定數目的服務進程,客戶端發來的請求會首先發送到dispatcher即調度器,然後由dispatcher根據服務進程的忙閒情況,選擇性的把請求交付給具體的服務進程進行響應,共享服務進程作出響應後,把響應的結果再交給dispatcher,由dispatcher再次交付給客戶端。在這個過程中,涉及到兩個隊列,即請求隊列跟響應隊列,這兩個隊列都位於SGA中,共享連接的會話信息放置在Large pool中,因此對SGA的使用更多。
使用dedicated mode,因為為每一個連接請求建立一個專屬進程進行響應,所以它的響應速度要比shared mode快,但dedicate mode要為每個請求建立專屬的PGA,所以對內存的需求更高。但在生產環境中,大多數都是使用dedicated mode。同時dedicated mode也是oracle的默認模式。
使用shared mode可以有效減少系統進程數目,可以在內存限制比較大的環境中使用。但shared mode因為在客戶端請求與服務器響應之間,必須要走dispatcher這道程序,也就更容易造成擁堵或死鎖,也可能因為某一請求長時間占用服務時間而造成其他請求的長時間等待,此外,共享模式不容易實現trace。在生產環境中,大多不適用shared mode,而使用中間件軟件來實現類似的需求。
Show parameter shared
首先shared_servers顯示的系統啟動時候啟用的共享服務進程的個數,這個參數大於0表示啟用了共享模式,這個參數不用設置過大,過大會增加啟動時間,oracle會自動根據負載調節共享服務進程的個數,這個數值只是啟動時候的初始值。
Max_shared_servers這個參數設置了共享服務進程的最大數。
Show parameter dispatcher
只啟動shared_server並不能真正啟用共享模式,還需要設置好dispatchers。Dispatchers的內容形如‘(protocol=tcp) (service=jf01) (dispatchers=3)’。其中protocol表示協議類型,service表示要啟用共享模式的服務名,dispatchers表示初始調度進程的數量。
Max_dispatchers為調度進程的最大數目。
共享模式下對應的後台進程分別為以“S”和“D”開頭的,S開頭的為服務進程,D開頭的為調度進程,形如S000,S001,D000,D001此類。可以通過select pname from v$process查看。
Dedicated模式是oracle的默認模式,oracle也不推薦使用shared模式。
Alter system set shared_servers=2;
設置此參數大於0
Alter system set dispatcher=’(protocol=tcp) (service=jf01) (dispatchers=3)’;
設置要啟用共享模式的服務。
此外,還需要再客戶端的tnsnames.ora文件中,在要使用共享模式連接的實例解析下更改
CONNECT_DATA 中的 (SERVER=SHARED )一項。
只有這樣,客戶端才會發起建立共享連接的請求。如果此時服務端沒有啟用共享模式,則會出現錯誤提示:
ORA-12520 TNS:Listener count not find available handler for requested type of server。
Alter system set shared_server=0;
Alter system set dispatcher=’’;
這樣就可以了。
Select server from v$session;
相關視圖
V$shaed_server
V$dispatcher
V$circuit