专有模式:当一个用户请求连接到ORACLE的时候,ORACLE会专门的为这个user process 分配一个server process。
共享模式:一个server process可以服务多个user process.如果要使用这个功能,必须使用net services.也就是说必须配置tns。它适合用于高并发,事物量小,如果这个时候采用了共享模式,可以大大减少由于高度并发对于ORACLE服务器的资源消耗。缺点:由于它是用一个queue 来管理,所以只要有一个会话死了,那么后面的会话将等待,也就是该服务器进程上的所有用户将被阻塞,另外不能用共享模式执行批处理,大数据量的处理,不能应用于数据仓库。

配置共享模式:shared server: shared_servers>0

新建一个连接,不产生新的server process,使用已有的s00n,d00n
连接多,时间短
即使数据库工作在共享模式,其本地连接也是专有的.


SQL> alter system set shared_servers=5 scope=both;
System altered.
SQL> alter system set dispatchers = "(protocol=tcp)(dispatchers=5)(protocol=ipc)(dispatchers=1)" scope=both;
System altered.
SQL> alter system set max_dispatchers=10 scope=both;
System altered.
SQL> show parameter shared_servers
NAME  TYPE  VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers  integer
shared_servers  integer  5
SQL> show parameter dispatcher
NAME  TYPE  VALUE
------------------------------------ ----------- ------------------------------
dispatchers  string  (PROTOCOL=TCP) (SERVICE=ORCLXDB), (protocol=tcp)(dispatchers=5)(protocol=ipc)(dispatchers=1)
max_dispatchers  integer  10


客户端(更改为共享模式)
$ORACLE_HOME/network/admin/tnsnames.ora
-------------------------


默认模式: DEFAULT =

(DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.1.242)(PORT = 1521))     )

   (CONNECT_DATA =

     (SERVICE_NAME = balance)     ) )  

专用模式: DEDICATED = (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.1.242)(PORT = 1521))     )

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = balance)     ) )  

共享模式:

ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = orcl)
)
)


--将Server改为共享模式,此时缺省为共享,新建连接,不产生oracle<sid>进程
--当Server为共享模式,客户端设为专有,仍为专有连接


查询是否使用的是共享方式连接到数据库

select username,server from v$session where username is not null;



关闭共享模式:

s将shared_servers参数置为0,那么所有以共享方式连接到数据库都不能成功,但是未释放的共享连接会继续保持连接,直到断开。如果将shared_servers 和max_shared_servers都设为0,那么共享连接将被终结。所有的共享方式连接都断开了的话,就可以使用alter system set dispatcher=’’;将dispatcher清除,防止下次启动数据库又打开了共享连接方式。


配置参数:

1.设置shared_servers :指定了当instance 启动的时候 shared server process 启动的数量,不要将这个参数设置得太大,否者启动数据库instance 的时候 就会花更多时间,Oracle启动过后会根据负载来动态调整shared_servers。如果为0,表示数据库没有启动共享服务模式。 这个参数是配置shared server 必须的,而且只有这个参数是必须的。如果将shared_servers参数置为0,那么所有以共享方式连接到数据库都不能成功,但是未释放的共享连接会继续保持连接,直到断开
2.设置max_shared_servers:ORACLE在同一个时刻最大能够使用的 shared server process.不要将这个参数设置小于 shared_servers,如果动态修改shared_servers大于max_shared_servers,ORACLE会覆盖 max_shared_servers的值,此时你需要修改max_shared_servers.同时也不能大于processes。这个参数是为了给 占用很大资源操作而设的(批处理),为了预留一些process 给DBA任务(rman备份)。如果将shared_servers 和max_shared_servers都设为0,那么共享连接将被终结。所有的共享方式连接都断开了的话,就可以使用alter system set dispatcher=’’; 将dispatcher清除,防止下次启动数据库又打开了共享连接方式。
3.设置 shared_server_sesions: 指定了总共允许的的shared server session的数量。如果设置了这个参数,那么就不要将这个值超过sessions,如果没有设置这个值,那么只要还有空闲的session,就可以被 使用。设置这个值是为专有连接预留user sessions.
4.设置dispatchers:Dispatchers参数用于配置共享模式架构中dispatcher进程,共享模式只少需要一个 dispatcher进程。如果你没有指定dispatcher参数,但又把SHARED_SERVER设为非0值启用了共享模式,这样数据库会缺省创建 一个TCP协议的dispather,等同于设置为dispatchers="(PROTOCOL=tcp)",oracle 也会自动设置一个基于tcp协议的dispatcher。
如果还需要配置其它dispatcher,你可能通过指定以下属性:
ADDRESS:指定dispathers监听的网络地址,如(DESCRIPTION=(ADDRESS=...))
PROTOCOL:Specify the network protocol for which the dispatcher generates a listening endpoint. For example:(PROTOCOL=tcp)
DISPATCHERS:指定dispathers数量
CONNECTIONS:第个dispatcher最大允许的最大连接数
TICKS:启用连接池时,连接空闲超时时间,以10分钟为单位,1表示10分钟,2表示20分钟
POOL:是否起用连接池
SERVICE:指定dispathers注册的service
以上属性名称关键字,你可以用3位或3位以上的缩写,如你需要指定sessions=3,你可以写成ses=3,sess=3 或sessi=3类似方式
配置样例
配置2个TCP协议的dispatcher,指定端口为5000,地址为192.168.0.111和3个TCPS协议的dispatcher
SQL> alter system set dispatchers="(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.111)(PORT=5000))(DISPATCHERS=2)","(ADDRESS=(PROTOCOL=TCPS)(HOST=rac1))(DISPATCHERS=3)";
注意:dispatchers配置好后,就算监听不起,客户端也能通过dispatcher配置连接上数据库
5.设置 max_dispatchers:设置同一时刻能够同时运行的dispatchers的数量,必须大于等于 dispatchers ,小于processes。这个参数也会被dispatchers覆盖,如果dispatchers大于max_dispatchers。
6.circuits:指定了virtual circuits的总数量。


常见问题
1、large_pool_size这个参数我该设为多大呢?
当large_pool_size的大小能够满足所有的共享服务进程所需的内存就可以了,当然如果内存够用的话可以适当的加大一点,如下的语句便可以得出自实例启动来MTS连接所用的内存的最大数量,可以看出来是200多M。
SELECT sum(value) "Max MTS Memory Allocated"
FROM v$sesstat ss, v$statname st
WHERE name = 'session uga memory max'
AND ss.statistic#=st.statistic#
Max MTS Memory Allocated
------------------------
214457296
2、如何判断我dispatcher的数量是不是够用呢?
用如下的语句,当dispatcher的繁忙比率超过50%的时侯,你就要考虑增加Dispatcher的数量了,用Alter system动态却可完成。
SELECT name, (busy / (busy + idle))*100 "Dispatcher % busy Rate"
FROM V$DISPATCHER

3、如何判断共享服务进程是不是够用呢?
使用如下的语句来确定每次请求的平均等待时间,监测Average Wait time per reques这个值,当这个值持续增长时你该考虑增加shared servers了。
SELECT decode(totalq,0,'No Requests') "Wait Time",
Wait/totalq ||'hundredths of seconds' "Average Wait time per request"
FROM V$QUEUE
WHERE type = 'COMMON'

4、如何在MTS配置的Server请求Dedicate的连接着?
你在Tnsnames.ora中做服务名配置时加入SRVR=DEDICATED这个选项就可以了,示例如下:
billing =
(DEscrīptION =
(
ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = ks3)(PORT = 1521))
)
(
CONNECT_DATA =
(SERVICE_NAME = billing)
(SRVR = DEDICATED)
)
)