程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle數據庫服務器的兩種連接方式

Oracle數據庫服務器的兩種連接方式

編輯: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;
 begin
loop
 a := a + 3;
 end loop;
 end;
/


此時我們查看那個進程為我們這個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,那麼共享連接方式將被終結。所有的共享方式連接都會斷開(已經連接的會話也會斷開)


系統已更改。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved