我们可以通过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)