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