专有服务器模式中,用户进程运行在客户端的机器,专有服务器进程运行在数据库服务器端的机器。用户进程和专有服务器进程是两种不同类型的进程。当客户端发出连接数据库请求的时候,监听器吧客户端连接到专有服务器进程。即使这个服务进程很空闲,这个专有服务器进行也只为这个用户进程服务。用户进行和专有服务器进程是一一对应的关系,用户进程和服务器进程可以在不同机器上,用户和服务器进程的比率是1:1,即使用户进程没有任何请求,服务器进程仍然存在并保持空闲状态。
适合专有服务器环境:
1、只有少数客户端
在纪录量多、连接用户又比较少的情况下,采用专用服务器模式,可以说是比较明智的选择。
2、为数据仓库搭建的数据库系统。
如果这个数据库是为了实现数据仓库而搭建的,则必须要采用专属服务器模式。这是Oracle数据库的强制要求。
3、联机事务处理系统。
若联机事务处理系统统是符合两个条件
A 用户连接请求数大于共享进程
B 事务大部分是长事务或者大事务
则采用专用服务器连接模式比采用共享服务器连接模式效率要高。
共享服务器
共享服务器模式中,调度进程接受多个客户端的连接请求,并吧这些请求放到一个公共队列中.空闲的服务器进程从这个公共队列中抓出这些请求,然后完成请求的任务,完成任务后,把结果放到响应队列中,调度进程再从响应队列中把完成的结果返回给客户端。
结构三部分:
1、监听器
2、一个或多个调度进程
3、一个或多个共享服务器进程
监听器和调度进程的关系
当数据库实例启动的时候,调度进程会吧自己的地址告诉监听器。当用户进程请求一个数据库连接的时候,监听器将首先检查这个请求,然后决定该用户进程是否允许使用共享服务器进程。如果允许,监听器把负载最小的调度进程地址给用户进程,然后用户进程直接连接到这个调度进程。
如果用户进程不能连接到调度进程,或用户请求的是一个专有服务器连接,则监听器将创建一个专有服务器进程,并把这个用户进程连接到专有服务器进程。
请求队列和响应队列
当一个用户发出一个调用请求的时候,这个用户进程的调度把这个请求放到请求队列中。这个请求将一直在请求队列中,直到一个空闲的共享服务器进程出现,这个空闲的共享服务器进程将从响应队列总取出这个请求,进行处理。
当共享服务器进程处理玩这个请求的时候,他会吧处理结果放到响应队列中,这个时候,共享服务器进程空闲,他将执行在请求队列中的另一个请求。
请求队列是一个公共的队列,他被多哦有的调度进程所共享。请求队列存在SGA中。共享服务器进程按照先进先出的原则对请求队列中的请求进程处理。
响应队列也存在SGA中,不同的是每个调度都有自己的响应队列调度进程从响应队列中读取完成请求,返回给用户进程
PMON进程通过监听器注册调度进程的位置和负载,监听器可以将请求转发给利用率最小的调度进程
一个调度进程可以支持多个客户端的并发连接,每个客户连接绑定一个虚拟环路
一个虚拟环路是调度进程为客户数据库连接请求和响应的一块共享内存。
当一个请求到达时,调度进程在请求队列放置一个虚拟环路,共享服务进程从请求队列取出虚拟环路,并处理该请求。在取出其它虚拟环路之时,共享服务进程将放弃当前的虚拟环路。监听程序负责给客户提供将要连接的调度程序的地址,PMON负责通知监听程序,那个调度程序负责这个虚拟回路。监听程序从而直到该调度程序目前负责的连接数目,该信息允许监听程序利用调度程序负载均衡。
合适共享服务器环境:
1、前台客户端数量比较多。
2、服务器内存限制比较大。
用户若在一些老的服务器上部署Oracle数据库的话,因为其主板对内存的升级有所限制,所以,为了得到一个不错的数据库性能,往往采用共享服务器模式。如此,即时同时访问数据库
的用户有所增加,其内存也不会有多大的影响。可以大大的降低内存的压力。
3、某些特定功能要求采用共享服务器模式。
比较典型的,如Oracle数据库服务器的连接共享、连接集中与负载均衡技术等等。他们必须在共享模式下才能够运行。
负载均衡用来在群集环境下实现多机共享数据库,以保证应用的高可用性。同时可以自动实现并行处理以及均分负载,还能够实现数据库在故障时的容错和无断点恢复。所以,在一些对
于性能与稳定性要求比较高的应用场景中,如银行中,往往都会采用负载均衡技术。此时,数据库管理员在配置数据库的时候,就需要考虑采用共享服务器模式。
共享服务模式中,如果没有显示请求一个专用连接,就会连接到一个调度器上。
共享服务器好处
1、减少操作系统进程/线程数
在一个有上千用户的系统上,如果操作系统力图管理数千个进程,可能很快就崩溃了。如果使用共享模式,可以有效的管理活动的部分用户,效率大大提高,操作系统可以避免了上下
文切换。
2、刻意的限制并发度
如果并发数过大,到一定程度,即使用户量再增加,每秒中完成的相应事物也不会增加。吞吐量到达一定峰值后会下降。利用共享服务器,可以把系统并发度限制到合理的数量上。
3、减少系统所需的内存
可以减少所需内存量,但是在自动PAG内存管理以后,意义不是很大。
缺点
1、 不适宜大量结果的应用
2、 不适宜长时间处理的事物
3、 不能提高性能,只能提高可靠性
1.2 服务器模式的设置
启用专用服务器
dedicated servers不需要专门的设置,这个是oracle的默认选项。
启用共享服务器
要切换到共享模式,可以使用以下步骤:
A.设置初始化参数 SHARED_SERVERS 大于0,可以使用alter system命令动态的设置也 可以在spfile里面修改初始化参数SHARED_SERVERS 的值大于0,然后shutdown oracle,然后
restart oracle 即可启动共享模式,其他的共享服务器参数可以不用设置
参考语句:
alter system setshared_servers = 1 scope=both ;
alter system setmax_shared_servers = 5 scope=both ;
B.设置dispatchers 参数,可以采用下面的方法设置:
alter system setdispatchers="(PROTOCOL=TCP) (SERVICE=XXX1)(SERVICE=XXX2)(DISPATCHERS=2)";
前面表示的是协议,后面的service分别指定要采用共享服务器模式的服务名称
dispatches参数设置为空的话,不能启动共享服务器,使用上面的模式指定只启动某个服务的
共享模式,如果要设置所有服务都使用共享模式,则设置为:
alter system set dispatchers='(PROTOCOL=TCP)';
alter system set max_dispatchers= 5 scope=both
C.在客户端的tnsnames.ora 的tns设置中,在 CONNECT_DATA 设置一项中增加 (server=shared )一项,即可使用共享服务器连接
如果服务器端没有启动共享服务器模式,而客户端使用shared方式连接的话,会出现错误提示:
“ORA-12520:TNS: 监听程序无法找到需要的服务器类型的可用句柄”;
关闭调度进程:
首先要查询到DISPATCHERS的NAME: SELECTNAME,NETWORK FROM V$DISPATCHER;
然后关闭调度进程:ALTERSYSTEM SHUTDOWN IMMEDIATE 'D000';
circuits(虚拟回路):指定了virtual circuits 的总数量,它的值将会影响SGA大小,默认值等于SESSIONS。
SQL> select * from V$CIRCUIT;
参数说明:
shared_servers :指定了当instance 启动的时候 shared server process 启动的数量,不要将这个参数设置得太大,否者启动数据库instance 的时候就会花更多时间,Oracle启动过后会根据负载来动态调整shared_servers。如果为0,表示数据库没有启动共享服务模式。这个参数是配置shared server 必须的
--修改参数: alter system set shared_servers=1;
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备份),
dispatchers和max_dispatchers设置调度进程数量,必须设置
shared_server_sesions: 指定了总共允许的的 sharedserver session 的数量。如果设置了这个参数,那么就不要将这个值超过sessions,如果没有设置这个值,那么只要还有空闲的session,就可以被使用。设置这个值是为专有连接预留 user sessions.
其它参数
LARGE_POOL_SIZE,配置该参数后,共享服务器将UGA放入large pool而不是shared pool,这样可以提高共享池性能,该参数最小300K
SESSIONS 制定oracle服务器可以创建的会话数量
1.3 判断数据库使用的连接模式
查看当前数据库服务器的运行情况有一下几种办法:
A.从v$session里面查看:
SQL> select distinct server from v$session ;
SQL>
SERVER
---------
DEDICATED
NONE
SQL>
如果显示的除了dedicated,还有NONE,则说明当前启动了共享服务器,并且server为none的会话正使用共享服务器连接,
同时,如果只显示有dedicated,则不能说明服务器就一定工作在专用服务器下面,此时只能说明有可能启动了共享模式,
但是无连接
可以使用下面的语句查询采用共享服务器的会话信息:
select saddr,program ,server from v$session
B.查询视图:
在网上有的资料上说只要查询下面三个视图,有记录则说明启动了共享模式,经过验证,具体情况如下:
select * from v$shared_server; ---有记录,且STATUS字段为WAIT(COMMON),则说明启动共享;
status为TERMINATED或者无记录,则说明没有启动共享服务器
select * from v$dispatcher; --有无记录都不能说明启动共享服务器,只能说明是配置了dispatchers参数
select * from V$CIRCUIT ; --有记录说明当前有使用共享模式的连接,无记录则不能判定服务器模式
C.查询监听器的状态
1.4、客户端建立的连接模式
A.当服务器采用专用服务器模式时,客户端只能使用专用模式连接,也就是在connect_data数据中只能使用 server=dedicated。
B.当服务器采用共享服务器模式时,客户端可以选择建立共享还是专用连接,connection,只要在 connect_data 中指定server=dedicated or server=shared
大多数情况下我们更倾向或习惯专用模式,两种模式下,对sga等分配都会有不同,所以如果转换成mts模式,别忘了sga也是需要调整的。最典型的是mts模式需要较大的large_pool_size。如果真想转换还是仔细看看oracle关于mts的文档。共享连接只是把连接SESSION信息放在LARGE POOL,所以LARGE POOL要大一些。而专用连接的SESION信息放在PGA。
1.5、禁用共享服务器模式
alter system set shared_servers = 0 ;
alter system set max_shared_servers = 0 ;