當用戶需要訪問數據庫時,在客戶端要建立一個用戶進程-在服務器端,需要為用戶進程分配一個服務器進程,兩個進程之間建立連接,服務器進程處理用戶進程的請求。
客戶端應用程序可以是SQL*Plus 、EM 、RMAN ,或者用戶自己開發的Java應用程序。
用戶進程必須通過服務器進程才能訪問數據庫實例。
服務器進程接受用戶進程的請求,解析並執行用戶進程發送的SQL命令,然後檢查數據庫高速緩存。
如果用戶訪問的數據恰好就存儲在緩沖區中,那麼服務器進程直接在緩沖區中對數據進行處理,並將執行結果返回給用戶進程。
否則,服務器進程將從數據文件中讀取所需的數據,並將數據復制到數據庫高速緩存中,然後在數據庫高速緩存對數據進行處理。
一個服務器進程可以僅為一個用戶進程服務,也可以同時為多個用戶進程服務。
根據用戶進程是否可以共享服務器進程, Oracle提供了兩種數據庫連接模式:
專用數據庫連接模式和共享數據庫連接模式。
專用數據庫連接模式
在專用數據庫連接模式下,服務器進程與用戶進程是一一對應的。
每當有一個用戶進程試圖與數據庫服務器建立連接時,數據庫服務器便啟動一個服務器進程為用戶進程服務。
而當用戶進程訪問結束,斷開連接時,服務器進程也自動終止。
下圖表示數據庫連接模式中的專用連接模式。
在這裡我們要注意區分數據庫、數據庫服務器和服務器進程的概念。
在專用數據庫連接模式下,各個服務器進程之間完全獨立,它們之間並不共享數據。
當用戶進程連接數據庫服務器時,服務器進程便被啟動,而且在一直運行,直到用戶進程斷開連接。
對於單個用戶進程而言,專用連接模式的效率是很高的,因為一個服務器進程只為一個用戶進程服務。
但是對一個大型的數據庫系統而言,這種連接模式未必合適,一方面,在服務器端需要啟動大量的服務器進程,以處理眾多的用戶進程的請求,這對整個系統來說,負載是很重的。
另一方面,當用戶進程和服務器進程建立連接後,服務器進程的大部分處理時間都在等待用戶的輸入輸出,處理用戶的請求只需要很短的時間。
如果用戶進程數目較少,或者用戶進程需要對數據庫進行大量的訪問,那麼可以考慮將數據庫連接模式設置為專用模式。
共享數據庫連接模式
專用數據庫連接模式在處理大批量用戶連接時效率並不高,因為需要為每個用戶進程啟動一個服務器進程,這樣會消耗大量的系統資源。
如果用戶進程的大部分連接時間都處於空閒狀態,服務器的資源就會被白白浪費。
比如在銀行儲蓄系統中,計算機處理一次存取款的時間為幾毫秒,而工作人員輸入相關信息卻需要幾分鐘的時間。
Oracle提供了一種共享數據庫連接模式,這種模式允許一個服務器進程同時為多個用戶進程服務,多個用戶進程共享一個服務器進程。
當一個用戶進程處於空閒狀態肘,比如正在等待用戶輸入數據,服務器進程就可以處理其他用戶進程的請求。
在這種情況下,服務器進程的工作效率得到了很大的提高。
在數據庫服務器中可以啟動多個共享服務器進程,每個服務器進程都可以處理多個用戶請求,在數據庫服務器中只需要少量的服務器進程就可以處理大量的用戶請求。
Oracle推薦在以下情況采用共享數據庫連接模式:
·在聯機事務處理(OLTP)環境中訪問數據庫。可能有大量用戶進程需要連接到數據庫服務器,這種模式可以使用戶進程有效地使用系統資源。
·計算機的內存有限。與專用服務器相比,當用戶進程數量增加時,共享服務器的數量並不需要增加,或者增加很少,這就減少了對內存的要求。
·如果需要使用Oracle Net的特性,如連接共享、連接集中和負載均衡。
共享數據庫連接模式的工作原理如下圖所示。
在上圖中,調度器、共享服務器進程、請求隊列和響應隊列共同完成共享數據庫連接模式的功能。
其中請求隊列和響應隊列是SGA的一部分,為了更清楚地表示這幾部分之間的關系,在上中我們將這兩個隊列從SGA 中分離出來。
調度器負責接收用戶的請求,並將用戶請求傳遞給適當的共享服務器進程。
在一個數據庫服務器中可以啟動多個調度器,而且至少要為Oracle支持的每一種網絡協議啟動一個調度器(如TCP/IP 、I PX/SPX 、命名管道等)。
可以通過初始化參數DISPATCHERS 和MAX_DISPATCHERS來指定調度器的數目。
其中參數DISPATCHERS指定為某類網絡協議啟動的調度器,而MAX_DISPATCHERS用來設置數據庫服務器中可以啟動的最大調度器的數目。
例如:
DISPATCHERS=(PROTOCOL=TCP)(DISPATCHERS=3)
MAX_DISPATCHERS=20
上面的兩個參數規定為TCP/IP協議啟動3個調度器,而總的調度器數目為20 。
當用戶進程向數據庫服務器發出請求時,監聽器在指定的端口監聽用戶的請求,並將請求傳遞給一個負載較輕的調度器,調度器將這個請求以及自己的ID一起放到請求隊列中。
共享服務器進程從請求隊列中取出一個請求,並對其中的SQL命令進行解析和執行,然後將執行的結果放到響應隊列中。
解析和執行的過程與專用服務器相同。
在一個數據庫服務器中可以啟動多個共享服務器進程,這些進程可以處理任何一個用戶進程發出的請求,而不是處理一個確定的請求。
共享服務器進程的數目由初始化參數SHARED_SERVERS 和MAX_SHARED_SERVERS指定,其中參數SHARED_SERVERS指定在初始情況下需要啟動的共享服務器進程數目,而參數MAX_SHARED_SERVERS指定了允許啟動的最大共享服務器進程數目。
當用戶請求較多時,數據庫服務器將啟動更多的共享服務器進程,而當用戶請求較少時,服務器將關閒不必要的共享服務器進程,但在任一時刻,共享服務器進程的數目將保持在兩個參數SHARED_SERVERS和MAX_SHARED_SERVERS的值之間。
調度器除了負責將用戶進程的請求傳遞給共享服務器進程外,還負責將共享服務器進程處理的結果返回給用戶進程。
調度器周期性地檢查響應隊列,如果發現與自己ID一致的處理結果,調度器將取出這個結果,並將它返回給用戶進程。
這個處理結果就是在此之前,由該調度器傳遞給共享服務器進程的某個用戶請求的處理結果,調度器根據其中的ID判斷它是否屬於自己。
需要注意的是,在共享數據庫連接模式下也可以啟動專用服務器進程。
有些用戶請求是不適合以共享數據庫連接模式處理的。
例如,當用戶以DBA身份登錄數據庫服務器時,用戶進程無法與調度器通信。
當數據庫服務器監聽到這樣的用戶請求時,它將為用戶進程啟動一個專用服務器進程,以處理該用戶的所有操作。
如何設置共享連接模式
要將數據庫服務器的連接模式從專用模式改為共享模式其實是很簡單的,只要將初始化參數SHARED_SERVERS的值設置為一個大於0的整數即可,其余幾個初始化參數都不是必須設置的。
在共享模式中至少需要一個調度器,因此,當把連接模式改為共享模式之後,在數據庫服務器中將自動啟動一個調度器。
如果把初始化參數SHARED_SERVERS 的設置放在參數文件中,那麼當數據庫服務器啟動時就處於共享連接模式。
如果在參數文件中沒有對這個參數進行設置,但是通過初始化參數DISPATCHERS至少設置了二個調度器,那麼數據庫服務器啟動時也處於共享連接模式。
如果數據庫是通過DBCA創建的,在數據庫中將有一個為XDB協議配置的調度器,而且初始化參數SHARED_SERVERS值為1 。
只要用戶訪問Oracle的XML DB服務,就連接到一個共享服務器進程上。
這並不意味著數據庫服務器目前就使用了共享連接模式,這時還需要設置更多的共享服務器進程和調度器。
Oracle推薦的共享服務器進程數目設置原則為:每10個客戶端進程對應一個服務器進程。
數據庫管理員可以根據客戶端進程的大致數目,設置共享服務器進程的數目,而且在數據庫服務器運行的過程中,可以根據實際情況,隨時調整服務器進程的數目。
例如:
ALTER SYSTEM SET shared_servers=5;
共享服務器進程的相關信息可以從動態性能視圖v$shared_server中獲得。
下面是有關動態性能視圖v$shared_server的相關信息:
V$SHARED_SERVER
displays information on the shared server processes.
NAME
VARCHAR2(4)
Name of the server
PADDR
RAW(4 | 8)
Server's process address
STATUS
VARCHAR2(16)
Server status:
EXEC
- Executing SQL
WAIT (ENQ)
- Waiting for a lock
WAIT (SEND)
- Waiting to send data to user
WAIT (COMMON)
- Idle; waiting for a user request
WAIT (RECEIVE)
- Waiting for records to be shown(顯示) in the client application
WAIT (RESET)
- Waiting for a circuit(流程,環) to reset after a break
QUIT
- Terminating
MESSAGES
NUMBER
Number of messages processed
BYTES
NUMBER
Total number of bytes in all messages
BREAKS
NUMBER
Number of breaks
CIRCUIT
RAW(4 | 8)
Address of the circuit currently being serviced
IDLE
NUMBER
Total idle time (in hundredths(百分) of a second)
BUSY
NUMBER
Total busy time (in hundredths of a second)
IN_NET
NUMBER
Total incoming network wait time (in hundredths of a second)
OUT_NET
NUMBER
Total outgoing network wait time (in hundredths of a second)
REQUESTS
NUMBER
Total number of requests taken from the common queue in this server's lifetime
CON_ID
NUMBER
The ID of the container to which the data pertains. Possible values include:
0
: This value is used for rows containing data that pertain to the entire CDB. This value is also used for rows in non-CDBs.
1
: This value is used for rows containing data that pertain to only the root
n: Where n is the applicable container ID for the rows containing data
服務器的命名規則是Snnn ,其中nnn是從000開始的三位整數。
例如,下面的SELECT語句用於查詢共享服務器進程的名稱和狀態:
SELECT name, status FROM v$shared_server;
如果將數據庫服務器的連接模式設置為共享模式,那麼至少需要設置一個調度器。
在默認情況下,數據庫服務器將為TCP協議設置一個調度器。
根據客戶端與服務器端通信的實際情況,需要為每種通信協議設置一個調度器。
對於TCP/IP協議,需要指定調度器所監聽的IP地址和端口號。
例如,下面的語句將使用TCP/IP協議的調度器的數目設置為3:
ALTER SYSTEM SET DISPATCHERS =
"(ADDRESS=(PROTOCOL=TCP)(HOST=192.169.20.22))(DISPATCHERS=3)";
調度器的相關信息可以從動態性能視圖V$DISPATCHER 中獲得。
下面是有關動態性能視圖V$DISPATCHER的相關信息:
V$DISPATCHER
displays information about the dispatcher processes.
NAME
VARCHAR2(4)
Name of the dispatcher process
NETWORK
VARCHAR2(1024)
Network address of the dispatcher
PADDR
RAW(4 | 8)
Process address
STATUS
VARCHAR2(16)
Status of the dispatcher:
WAIT
- Idle
SEND
- Sending a message
RECEIVE
- Receiving a message
CONNECT
- Establishing a connection
DISCONNECT
- Handling a disconnect request
BREAK
- Handling a break
TERMINATE
- In the process of terminating
ACCEPT
- Accepting connections (no further information available)
REFUSE
- Rejecting connections (no further information available)
ACCEPT
VARCHAR2(3)
Indicates whether the dispatcher is accepting new connections (YES
) or not (NO
)
MESSAGES
NUMBER
Number of messages processed by the dispatcher
BYTES
NUMBER
Size (in bytes) of messages processed by the dispatcher
BREAKS
NUMBER
Number of breaks occurring in the connection
OWNED
NUMBER
Number of circuits owned by the dispatcher
CREATED
NUMBER
Number of circuits created by the dispatcher
IDLE
NUMBER
Total idle time for the dispatcher (in hundredths of a second)
BUSY
NUMBER
Total busy time for the dispatcher (in hundredths of a second)
LISTENER
NUMBER
Most recent Oracle error number the dispatcher received from the listener
CONF_INDX
NUMBER
Zero-based index of the DISPATCHERS
configuration used by the dispatcher
CON_ID
NUMBER
The ID of the container to which the data pertains. Possible values include:
0
: This value is used for rows containing data that pertain to the entire CDB. This value is also used for rows in non-CDBs.
1
: This value is used for rows containing data that pertain to only the root
n: Where n is the applicable container ID for the rows containing data
調度器的命名規則是Dnnn ,其中nnn是從000開始的三位整數。
例如,下面的SELECT語句用於查詢調度器的名稱、所用協議、狀態等信息:
SELECT name, network, status FROM v$dispatcher;