Oracle資料庫伺服器的兩種連線方式

Diy_os發表於2015-04-15
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,那麼共享連線方式將被終結。所有的共享方式連線都會斷開(已經連線的會話也會斷開)


系統已更改。



為無法我是河陽

而他個人的觀點

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1578032/,如需轉載,請註明出處,否則將追究法律責任。

相關文章