題目部分
在Oracle中, 什麼是專用服務器和共享服務器?
♣
答案部分
在連接到Oracle數據庫的時候,可以有兩種連接模式,一種叫做專用服務器連接(Dedicated Server),另外一種叫做共享服務器連接(Shared Server)。下面將分別講解這兩種連接方式的不同點。
專用服務器:每次在對Oracle進行訪問的時候,Oracle服務器的Listener會得到這個訪問請求,然後會爲這個訪問創建一個新的進程來進行服務。所以說,對於每一個客戶端的訪問,都會生成一個新的進程進行服務,是一種類似一對一的映射關係。這種連接模式的一個很重要的特點就是UGA(User Global Area,用戶全局區)是存儲在PGA(Program Global Area,程序全局區)中的,這個特性也很好說明了當前用戶的內存空間是按照進程來進行分配的。專用服務器連接模式是Oracle默認的連接模式。
共享服務器:也叫多線程服務器(Multi-Threaded Server,MTS)。若採用共享服務器模式的話,則在數據庫初始化的時候就會創建一批服務器連接的進程,然後把這些連接進程放入一個連接池來進行管理。初始化的池中的進程數量在數據庫初始化建立的時候是可以手動設置的。在連接建立的時候,Listener首先接收到客戶端的建立連接的請求,然後Listener去生成一個叫做調度器(Dipatcher)的進程與客戶端進行連接。調度器把客戶端的請求放在SGA(System Global Area,系統全局區)的一個請求隊列中,然後在共享服務器連接池中查找有無空閒的連接,然後讓這個空閒的服務器進行處理。處理完畢以後再把處理結果放在SGA的相應隊列中。調度器通過查詢相應隊列,得到返回結果,再返回給客戶端。這種連接模式的優點在於服務器進程的數量可以得到控制,不大可能出現因爲連接數過多而造成服務器內存崩潰。但是由於增加了複雜度以及請求相應隊列,可能在性能上有所下降。
如果在前端使用了Weblogic的連接池,那麼在數據庫級別就沒有必要再使用共享服務器了,因爲這時的用戶連接已經在Weblogic層面上得到了控制。其實專用服務器和共享服務器是可以並存的,即使使用了共享服務器,某些管理操作也是必須在專用服務器模式下來做的,比如STARTUP或SHUTDOWN。
(一)啓用共享服務器
要切換到共享模式,可以使用以下步驟:
A.設置初始化參數SHARED_SERVERS大於0,然後重啓數據庫即可啓動共享模式,SQL如下所示:
ALTER
SYSTEM SET
SHARED_SERVERS = 1 SCOPE=BOTH ;
ALTER
SYSTEM SET
MAX_SHARED_SERVERS = 5 SCOPE=BOTH ;
其中,SHARED_SERVERS指定了當實例啓動的時候共享服務器進程啓動的數量。如果這個參數的值爲0,那麼表示數據庫沒有啓動共享服務模式。這個參數是配置共享服務器必須的,而且只有這個參數是必須的。MAX_SHARED_SERVERS是Oracle在同一個時刻最大能夠使用的共享服務器進程數量。如果SHARED_SERVERS大於MAX_SHARED_SERVERS,那麼Oracle會以SHARED_SERVERS參數的值覆蓋MAX_SHARED_SERVERS。
B.設置DISPATCHERS參數,可以採用下面的方法設置:
ALTER
SYSTEM SET
DISPATCHERS="(PROTOCOL=TCP) (SERVICE=lhrdbXDB)";
其中,“PROTOCOL=TCP”表示的是協議,“SERVICE=lhrdbXDB”指定要採用共享服務器模式的服務名稱。使用上面的模式指定只啓動某個服務的共享模式,如果要設置所有服務都使用共享模式,則設置爲:
ALTER
SYSTEM SET
DISPATCHERS='(PROTOCOL=TCP)';
C.在客戶端的tnsnames.ora的文件中,在CONNECT_DATA設置一項中增加“(server=shared)”一項,即可使用共享服務器連接,如下所示:
orclasms =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.59.130)(PORT = 1521))
(CONNECT_DATA =
(SERVER = shared)
(SERVICE_NAME = orclasmXDB.lhr.com)
)
)
其中,SERVICE_NAME的值可以通過命令“lsnrctl services <listener name>”來查看,如下所示:
[root@rhel6lhr ~]# lsnrctl services LISTENER
。。。省略部分。。。
Service "orclasmXDB.lhr.com"
has 1 instance(s).
Instance "ORCLASM", status READY, has 1 handler(s) for
this service...
Handler(s):
"D000"
established:1 refused:0 current:1 max:1022 state:ready
DISPATCHER <machine: rhel6lhr, pid: 33611>
(ADDRESS=(PROTOCOL=tcp)(HOST=rhel6lhr)(PORT=58010))
The command completed successfully
如果服務器端沒有啓動共享服務器模式,而客戶端使用shared方式連接的話,那麼會出現錯誤提示:“ORA-12520: TNS: 監聽程序無法找到需要的服務器類型的可用句柄”。
如果同時把SHARED_SERVERS和MAX_SHARED_SERVERS都設置成0,那麼共享服務器將關閉。
(一)判斷會話的連接模式
可以從V$SESSION視圖的SERVER列裏查看:
SYS@orclasm > SELECT
SERVER,COUNT(1) FROM
V$SESSION GROUP
BY
SERVER;
SERVER COUNT(1)
--------- ----------
DEDICATED 36
SHARED 1
NONE 1</machine: rhel6lhr, pid: 33611></listener name>
若顯示的結果中有NONE或SHARED,則說明當前啓動了共享服務器模式。其中,狀態爲NONE的會話表示當前共享服務器進程沒有任務處理,若進程正在執行某些任務則會表現爲SHARED狀態。如果只顯示有DEDICATED,則不能說明服務器就一定工作在專用服務器下面,此時只能說明有可能啓動了共享模式,但是無連接。
此外,還可以通過視圖V$SHARED_SERVER、V$DISPATCHER及V$CIRCUIT視圖查詢是否啓用了共享服務器連接。若V$SHARED_SERVER有記錄,且STATUS字段爲“WAIT(COMMON)”,則說明啓動共享;若STATUS爲TERMINATED或者無記錄,則說明沒有啓動共享服務器。V$DISPATCHER有無記錄都不能說明啓動共享服務器,只能說明是配置了DISPATCHERS參數。V$CIRCUIT有記錄說明當前有使用共享模式的連接,無記錄則不能判定服務器模式。其實通過命令“lsnrctl services <listener name>”也可以判斷是否啓用了共享服務器連接。
當服務器採用專用服務器模式時,客戶端只能使用專用模式連接,也就是在CONNECT_DATA數據中只能使用“SERVER=DEDICATED”。當服務器採用共享服務器模式時,客戶端可以選擇建立共享連接或是專用連接,只要在CONNECT_DATA中指定“SERVER=DEDICATED”或“SERVER=SHARED”。
& 說明:
關於共享服務器和專用服務器的詳細解析可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2138307/。