Oracle資料庫伺服器的兩種串連方式,oracle資料庫
oracle提供了兩種資料庫連接方式,一種是專有串連方式,另一種是共用串連方式。區別在於專有串連方式是一個使用者對應一個資料庫伺服器進程,而共用伺服器串連方式是多個使用者可以不定向輪流使用一個伺服器處理序。oracle推薦專有串連,一個session對應一個伺服器處理序,會減少競爭,對於較長事務很有用,但是會耗費PGA資源;共用串連方式對於事務執行時間短且伺服器資源受限的系統是有利的。對於該使用哪種串連方式,自己權衡。
我們可以通過dbca設定資料庫的串連方式:
當然我們也可以通過修改參數shared_servers來設定串連資料庫的方式,該參數是0時,表示是專有串連,不為0時,則是共用串連。
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
下面依次分析專有和共用串連:
專有串連方式:
SQL> show parameter shared_servers;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer
shared_servers integer 0
現在我的資料庫連接方式是專有串連。
官方文檔(11.2)上給提供了專有串連方式的模式圖:
當我們本地串連資料庫時,佈建服務命名時,需要我們指明串連資料庫的方式,下面是tnsnames.ora裡配置資訊:
55 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 178.20.121.96)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = jing)
)
)
注意:當我們用共用方式串連資料庫時,則tnsnames.ora裡的SERVICE_NAME必需是動態註冊的監聽服務。
SQL> select distinct SID from v$mystat;
SID
----------
125
SQL> select server from v$session where SID=125;
SERVER
---------
DEDICATED
我們通過SID來尋找為此session服務的作業系統進程號(spid)以及資料庫內部標識的進程號(pid):
SQL> select paddr from v$session where sid=125;
PADDR
--------
393C5774
SQL> select pid,spid from v$process where addr='393C5774';
PID SPID
---------- ------------------------
19 4848
,
的19號進程是為此session服務的進程,專有伺服器處理序又叫做shadow process(shad)
共用串連方式:
我們可以通過修改參數shared_servers設定共用串連模式,11.2官方文檔也給了共用模式圖:
SQL> alter system set shared_servers=5;設定資料庫伺服器進程數量是5
系統已更改。
通過視圖v$shared_server我們可以直觀的看到伺服器處理序:
SQL> alter system set shared_server_sessions=20;設定資料庫的會話數是20
系統已更改。
SQL> show parameter dispatchers;調度進程參數
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dispatchers string (PROTOCOL=TCP) (SERVICE=orcl3939XDB)
max_dispatchers integer
如果dispatches參數設定為空白的話,不能啟動共用伺服器。
我們可以設定該參數:
alter system set dispatchers='(protocol=TCP)(disp=8)(serv=xxx)’
前面表示的是協議,disp表示調度器(dipatcher)的進程數量,service分別指定要採用共用伺服器模式的服務名稱。使用上面的模式指定只啟動某個服務的共用模式,如果要設定所有服務都使用共用模式,則設定為:
alter system set dispatchers='(PROTOCOL=TCP)';
SQL> alter system set dispatchers='(PROTOCOL=TCP)(dispatchers=2)';
系統已更改。
SQL> select distinct sid from v$mystat;
SID
----------
9
SQL> select paddr from v$session where sid=9;
PADDR
--------
393C8DAC
SQL> select distinct server from v$session;
SERVER
---------
DEDICATED
SHARED
SQL> select pid,spid from v$process where addr='393C8DAC';
PID SPID
---------- ------------------------
24 9722
為了類比整個過程,寫段死迴圈:
SQL> declare 2 a number :=0;
3 begin
4 loop
5 a := a + 3;
6 end loop;
7 end;
8 /
此時我們查看那個進程為我們這個session服務:
S004是當前為這個session服務的進程。
查看我們設定的兩個調度進程:
通過v$circuit,可以尋找到為當前進程服務的調度進程:
通過當前dispatcher的地址,尋找具體的調度進程:
若本地在共用模式下串連資料,則需要配置tnsnames.ora:
55 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 178.20.121.96)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = jing)
)
)
以下示範關閉共用串連模式:
SQL> alter system set shared_servers=0 scope=both;
系統已更改。
SQL> alter system set max_shared_servers=0 scope=both;
系統已更改。
SQL> show parameter shared_servers
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer 0
shared_servers integer 0
同時將參數shared_servers和max_shared_servers都設定為0,那麼共用串連方式將被終結。所有的共用方式串連都會斷開(已經串連的會話也會斷開)
系統已更改。