日期:2014-05-16  浏览次数:20541 次

共享模式和专有模式详解(原创)

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

专用服务器(DEDICATED): 每个客户进程与专用服务器进程连接。服务器进程没被任何另外的客户共享。 具体流程可参加下图
??
注意:专用服务器体系结构不支持HTTP和IIOP客户,仅支持TTC客户。
共享服务器(SHARED,也叫MTS Multi-Threaded Server):多个客户端连接对应一个服务器进程,服务器端存在一个进程调度器来管理。它必须使用net services.也就是说必须配置tns。它适合用于高并发,事物量小,如果这个时候采用了共享模式,可以大大减少由于高度并发对于ORACLE服务器 的资源消耗。 虽然MTS减少的内存实际上是专用服务器模式下每个用户连接到操作系统进程所需的内存,所减少的内存很 少。但是由于在MTS模式下使用SGA的Large_Pool来分配UGA,如果用户会话的连接和断开很频繁,数据库进程的创建和删除的开销会比专用模式 下小很多,如果不采用共享模式服务器,则应使用中间件的连接池技术。如果客户端一次连接终身使用(会话生命周期内),使用共享服务器模式的意义不大。因为大部分时间,一个会话就连接到一个服务器进程,无法共享服务器进程。
共享服务器体系:客户进程最终与一个调度程序连接,PMON进程注册了调度程序的位置和负荷,使监听器能够提交到负荷最小的调度程序。一个调度程序能并发地支持多重的客户连接。相信工作原理如下:
1.转发器Dispatcher接受到用户端的请求
2.请求被置入Request队列,并建立了类似电路的一条回路Circurt用来标识请求是来自哪个Client。
3.某个闲置的Server Process开始处理队列中的请求
4.SGA内存分配
5.将处理的结果置入Response队列
6.结果从Response Queue返回给Dispatcher
7.Dispatcher将结果最终返回给当初的Client
流程图如下
???????
一般我们以oracle默认的专用服务器方式就行了,没必要使用共享服务器模式。一个是我们是使用中间件(如:weblogic)去连oracle的,中间件本身有连接池机制,另外就是oracle的这个共享服务器方式也做的不够好了,有诸多缺点。
共享服务器具有以下一些缺点:
1、共享服务器的代码路径比专用服务器长,所以它天生就比专用服务器慢。
2、存在人为死锁的可能,因为它是串行的,只要一个连接阻塞,则该服务器进程上的所有用户都被阻塞,并且极可能死锁。
3、存在独占事务的可能,因为如果一个会话的事务运行时间过长,它独占共享资源,其它用户只能等待,而专用服务器,每个客户端是一个会话。
4、共享服务器模式限制了某些数据库特性,例如:不能单独启动和关闭实例,不能进行介质恢复,不能使用Log Miner,并且SQL_TRACE没有意义(因为是共享而不是当前会话的)。

5、不能执行DBA管理任务,如关闭数据库,备份、恢复等。

共享服务器和专用服务器的内存比较
假设一个应用程序访问Oracle的每个Session需要400KB的内存,每个服务进程的内存需要4MB,所分配的共享服务进程数为100个。现在有5000个客户连接,
则在Dedicated模式下:
内存=5000 * (400KB+4MB) = 22GB
Shared模式下:
内存=5000 * 400KB + 100 * 4MB = 2.5GB
共享服务初始化参数
shared_servers :指定了当instance 启动的时候 shared server process启动的数量,不要将这个参数设置得太大,否者启动数据库instance的时候就会花更多时间,Oracle启动过后会根据负载来动态调整 shared_servers。如果为0,表示数据库没有启动共享服务模式。 这个参数是配置shared server必须的,而且只有这个参数是必须的。
配置共享服务初始化参数:
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备份)。