专有模式和共享模式概述
专有模式:当一个用户请求连接到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备份)。 如果将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. alter system set shared_servers=1;
2. 配置tnsnames.ora里的服务名,这里需要注意一定要配置SID ,不是SERVICE_NAME,如果不是配的SID会报ORA-12523: TNS 错误。
ORACLE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = bluo7)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = bluo7)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME = xxx)
)
)
SHARED_SERVER =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 16.178.115.186)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 16.178.115.186)(PORT = 1522))
)
(CONNECT_DATA =
(SID = robinson)
(SERVER = SHARED)
)
)
3.使用共享的方式连接到数据库 conn sys/oracle@shared_server as sysdba,但是这个时候不能关闭数据库,也不能打开数据库,不能备份和恢复。
4.查看共享方式连接数据库状态
select count(*),server from v$session where username is not null gorup by server;
这里的server字段中的none值表示会话没有活动,dedicated表示通过专用服务器连接,通过shared表示共享服务器连接
使用lsnrctl service查看
$ lsnrctl service
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 15-APR-2012 15:28:22
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.111)(PORT=1521))(CONNECT_DATA=(SID=orcl)(SERVER=SHARED)))
Services Summary...
Service "orclXDB" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Handler(s):
"D000" established:1 refused:0 current:0 max:1022 state:ready
DISPATCHER <machine: rac1, pid: 2515>
(ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=61882))
常见问题
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)
)
)
参考至:http://www.cnblogs.com/lanzi/archive/2011/03/08/1977317.html
http://blog.chinaunix.net/uid-7249348-id-95762.html
http://blog.csdn.net/robinson1988/article/details/4681690
http://hi.baidu.com/homappy/blog/item/273f2087e2b2133dc75cc3a1.html
http://space.itpub.net/9399028/viewspace-682158
本文原创,转载请注明出处、作者
如有错误,欢迎指正
邮箱:czmcj@163.com
相关推荐
艾瑞咨询2020中国艾瑞给出专有云的定义:专有云是由第三方云服务厂商提供IT基础设施硬件资源和运维管理服务的,并从物理层面隔离出专属虚拟化资源池,所有计算资源仅供所服务的企业独享的一种云服务。也有厂商提出专...
英语专有名词是指由英语中特定的名词或词组构成的非普通的专用名称,是一种特殊的词汇,它们在日常语言中不是很普遍。英语专有名词具有特殊的意义,它们...变异的本质是为了使专有名词更容易理解,更容易被使用和记忆。
主扩展模式,通常用来将几个相似的对象的共有属性抽取出来,形成一个“公共属性表”;其余属性则分别形成“专有属性表”,且“公共属性表”与“专有属性表”都是“一对一”的关系
佛教爬取专有名词
提供C语言中专有名词的查询与对照,可以方便的查询到专有名词的中英文对照
对一些编程开发专有名词进行英译汉 break 分页;分行;中断 (v.);断点 (n.) break compatibility 破坏兼容性 break execution 中断执行 breakpoint 断点 Bring Forward 上移一层 Bring In Front 上移一层 ...
专有云文档,
个人整理的比较全面实用,通过面试考试的javaWEB开发的专有名词.doc格式文档
散热风扇生产 专有名词
国际专有技术转让合同 合同目录 前言 第一章 定义 第二章 合同的内容和范围
专利和专有技术使用许可合同.doc
网络信息安全专有名词解释
TIA 博途编程环境下专有技术保护的实现-密码保护与取消
值不值得就看各位对HF这本书的认同了,, 里面我使用visual paradigm site 3.4版 进行举例化的 UML图和JAVA源代码实现 而且有专有QQ群去讨论。 VP画的UML图是非常的漂亮,VP也是近来在ECLIPSE环境下使用比较高的一...
其余属性则分别形成"专有属性表",且"公共属性 表"与"专有属性表"都是"⼀对⼀"的关系。 ORM: ⼆、主从模式 主从模式,是数据库设计模式中最常见、也是⼤家⽇常设计⼯作中⽤的最多的⼀种模式,它描述了两个表之间的...
专利和专有技术使用许可合同样本.doc
C++所有常有专有名词中英对照表,是学习英文版教材的同学可以更方便的学习
计算机网络常见专有名词释义.doc
三菱PLC编程口和232BD专有协议与串口调试助手通信.wps
TIA Portal编程环境下专有技术保护的实现-密码保护与取消