------------------------------------ ----------- ------------------------------
现在我的数据库连接方式是专有连接。
官方文档(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,那么共享连接方式将被终结。所有的共享方式连接都会断开(已经连接的会话也会断开)
系统已更改。