【DB筆試面試526】在Oracle中, 什麼是專用伺服器和共享伺服器?

  • 2019 年 10 月 10 日
  • 筆記

題目部分

在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/。

本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。