前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【DB笔试面试526】在Oracle中, 什么是专用服务器和共享服务器?

【DB笔试面试526】在Oracle中, 什么是专用服务器和共享服务器?

作者头像
AiDBA宝典
发布2019-09-29 15:09:37
1.6K0
发布2019-09-29 15:09:37
举报
文章被收录于专栏:小麦苗的DB宝专栏

题目部分

在Oracle中, 什么是专用服务器和共享服务器?

答案部分

在连接到Oracle数据库的时候,可以有两种连接模式,一种叫做专用服务器连接(Dedicated Server),另外一种叫做共享服务器连接(Shared Server)。下面将分别讲解这两种连接方式的不同点。

专用服务器:每次在对Oracle进行访问的时候,Oracle服务器的Listener会得到这个访问请求,然后会为这个访问创建一个新的进程来进行服务。所以说,对于每一个客户端的访问,都会生成一个新的进程进行服务,是一种类似一对一的映射关系。这种连接模式的一个很重要的特点就是UGA(User Global Area,用户全局区)是存储在PGA(Program Global Area,程序全局区)中的,这个特性也很好说明了当前用户的内存空间是按照进程来进行分配的。专用服务器连接模式是Oracle默认的连接模式。

共享服务器:也叫多线程服务器(Multi-Threaded Server,MTS)。若采用共享服务器模式的话,则在数据库初始化的时候就会创建一批服务器连接的进程,然后把这些连接进程放入一个连接池来进行管理。初始化的池中的进程数量在数据库初始化建立的时候是可以手动设置的。在连接建立的时候,Listener首先接收到客户端的建立连接的请求,然后Listener去生成一个叫做调度器(Dipatcher)的进程与客户端进行连接。调度器把客户端的请求放在SGA(System Global Area,系统全局区)的一个请求队列中,然后在共享服务器连接池中查找有无空闲的连接,然后让这个空闲的服务器进行处理。处理完毕以后再把处理结果放在SGA的相应队列中。调度器通过查询相应队列,得到返回结果,再返回给客户端。这种连接模式的优点在于服务器进程的数量可以得到控制,不大可能出现因为连接数过多而造成服务器内存崩溃。但是由于增加了复杂度以及请求相应队列,可能在性能上有所下降。

如果在前端使用了Weblogic的连接池,那么在数据库级别就没有必要再使用共享服务器了,因为这时的用户连接已经在Weblogic层面上得到了控制。其实专用服务器和共享服务器是可以并存的,即使使用了共享服务器,某些管理操作也是必须在专用服务器模式下来做的,比如STARTUP或SHUTDOWN。

(一)启用共享服务器

要切换到共享模式,可以使用以下步骤:

A.设置初始化参数SHARED_SERVERS大于0,然后重启数据库即可启动共享模式,SQL如下所示:

ALTER SYSTEM SET SHARED_SERVERS = 1 SCOPE=BOTH ;

ALTER SYSTEM SET MAX_SHARED_SERVERS = 5 SCOPE=BOTH ;

其中,SHARED_SERVERS指定了当实例启动的时候共享服务器进程启动的数量。如果这个参数的值为0,那么表示数据库没有启动共享服务模式。这个参数是配置共享服务器必须的,而且只有这个参数是必须的。MAX_SHARED_SERVERS是Oracle在同一个时刻最大能够使用的共享服务器进程数量。如果SHARED_SERVERS大于MAX_SHARED_SERVERS,那么Oracle会以SHARED_SERVERS参数的值覆盖MAX_SHARED_SERVERS。

B.设置DISPATCHERS参数,可以采用下面的方法设置:

ALTER SYSTEM SET DISPATCHERS="(PROTOCOL=TCP) (SERVICE=lhrdbXDB)";

其中,“PROTOCOL=TCP”表示的是协议,“SERVICE=lhrdbXDB”指定要采用共享服务器模式的服务名称。使用上面的模式指定只启动某个服务的共享模式,如果要设置所有服务都使用共享模式,则设置为:

ALTER SYSTEM SET DISPATCHERS='(PROTOCOL=TCP)';

C.在客户端的tnsnames.ora的文件中,在CONNECT_DATA设置一项中增加“(server=shared)”一项,即可使用共享服务器连接,如下所示:

orclasms =

(DESCRIPTION =

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

(CONNECT_DATA =

(SERVER = shared)

(SERVICE_NAME = orclasmXDB.lhr.com)

)

)

其中,SERVICE_NAME的值可以通过命令“lsnrctl services <listener name>”来查看,如下所示:

[root@rhel6lhr ~]# lsnrctl services LISTENER

。。。省略部分。。。

Service "orclasmXDB.lhr.com" has 1 instance(s).

Instance "ORCLASM", status READY, has 1 handler(s) for this service...

Handler(s):

"D000" established:1 refused:0 current:1 max:1022 state:ready

DISPATCHER <machine: rhel6lhr, pid: 33611>

(ADDRESS=(PROTOCOL=tcp)(HOST=rhel6lhr)(PORT=58010))

The command completed successfully

如果服务器端没有启动共享服务器模式,而客户端使用shared方式连接的话,那么会出现错误提示:“ORA-12520: TNS: 监听程序无法找到需要的服务器类型的可用句柄”。

如果同时把SHARED_SERVERS和MAX_SHARED_SERVERS都设置成0,那么共享服务器将关闭。

(一)判断会话的连接模式

可以从V$SESSION视图的SERVER列里查看:

SYS@orclasm > SELECT SERVER,COUNT(1) FROM V$SESSION GROUP BY SERVER;

SERVER COUNT(1)

--------- ----------

DEDICATED 36

SHARED 1

NONE 1</machine: rhel6lhr, pid: 33611></listener name>

若显示的结果中有NONE或SHARED,则说明当前启动了共享服务器模式。其中,状态为NONE的会话表示当前共享服务器进程没有任务处理,若进程正在执行某些任务则会表现为SHARED状态。如果只显示有DEDICATED,则不能说明服务器就一定工作在专用服务器下面,此时只能说明有可能启动了共享模式,但是无连接。

此外,还可以通过视图V$SHARED_SERVER、V$DISPATCHER及V$CIRCUIT视图查询是否启用了共享服务器连接。若V$SHARED_SERVER有记录,且STATUS字段为“WAIT(COMMON)”,则说明启动共享;若STATUS为TERMINATED或者无记录,则说明没有启动共享服务器。V$DISPATCHER有无记录都不能说明启动共享服务器,只能说明是配置了DISPATCHERS参数。V$CIRCUIT有记录说明当前有使用共享模式的连接,无记录则不能判定服务器模式。其实通过命令“lsnrctl services <listener name>”也可以判断是否启用了共享服务器连接。

当服务器采用专用服务器模式时,客户端只能使用专用模式连接,也就是在CONNECT_DATA数据中只能使用“SERVER=DEDICATED”。当服务器采用共享服务器模式时,客户端可以选择建立共享连接或是专用连接,只要在CONNECT_DATA中指定“SERVER=DEDICATED”或“SERVER=SHARED”。

& 说明:

关于共享服务器和专用服务器的详细解析可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2138307/。

本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档