Oracle专用服务器与共享服务器的区别

 

1、原理

===================================================================

在建立Oracle数据库的时候,应该会在数据库建立助手向导上面看到这么一个选项,就是数据库的连接模式采用什么方式。在Oracle9i或者10g中,可以看到有2种连接模式,一种叫做专用服务器连接(dedicated server) ,另外一种叫做共享服务器连接(shared server)。下面我们来分类说一下这两种连接方式的不同点。

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

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

  总之,在开发阶段中,用第一种专用服务器可能好一些,因为少了一些中间的复杂度,而且开发的时候一般连接的数量也少。而在多个应用同时使用一个数据库的实际应用环境下,采用第二种方法可能好一些,因为如果到时候突然有1000个或者10000个请求连接的话,数据库服务器如果同时建立10000个连接,肯定要受不了的。当然,也要看到时候的实际情况如何再做决定,两者没有绝对的哪种好哪种不好的差别

      关于这两者的比较"假如你来到一个城市,要在这个城市的不同的地方办几件事情,在交通方面你有两种选择:一个是雇一辆专车,这辆专车将会把你从A带到B,一直等你把在B的事情办完,在把你从B带到C。。。。。。另一种选择是给出租车公司打电话订辆出租车,先把你从A带到B,然后你和出租车该干嘛干嘛,你去办你的事情,出租车去接别的生意,等你在B的事情办完了,你再跟出租车公司订车,出租车公司将会联系当时在B附近的其他出租车去接你。。。。。。

     对于shared servers,你就要需要做一些额外的设置,当让按照administrator guide并不难,关键是你需要决定到底需要多少个shared server servers和多少个dispatcher,这不仅仅需要经验的积累,还需要持续的观察和调整。

在dedicated servers里,你所有的等待都是数据库本身的等待,而在shared servers里你有可能需要等待一个available的shared server process。

     很明显,当用户并发的连接数很大的时候,dedicated servers的server process个数也会变得很大,对于操作系统来说多一个process就意味着多一点管理负担,要知道操作系统支持的同时并发数可不是无限的。这意味着,在dedicate servers里,当你有大量的用户连接(比如,同一时间超过5000个用户连上来),你的系统负担就会相当大。而这种情况shared servers就可以处理的相对好一些,因为加入同时有5000个用户连上来而且我们知道一般只有1%的连接是active,那我们只需要设置50个shared servers就可以把所有的用户请求处理得很好,并节省了系统资源。

     作为一个好处,shared servers可以用来控制concurrent。要知道用户的并发数和系统的处理能力决不是成正比的(可以下面的图),当用户并发数超过一个阀值,系统的处理能力会明显下降。通过shared servers可以控制系统的concurrent不超过这个阀值。

      在引入PGA的自动管理以前,shared servers是要比dedicated servers节省内存的,然后在自动管理的PGA引入之后,shared servers的这个优势已经不像我们想象的那么不明显了。

dedicate servers一个server process为了一个较大的request而长时间的工作而不影响其它的users,然而在shared servers,一些较大的request会影响其它的用户。

还需要考虑其他的因素,比如,如果在前端使用了weblogic的connecting pool,那么你在database level再使用shared servers可能就不是很必要,因为这时你的用户连接已经在weblogic层面上得到了控制。

shared servers还有一个所谓的伪死锁的问题,这点大家参考一下tom的新书就知道了。

关于dedicated servers和shared servers的话题我们就讨论这么多,最后给大家一个小提示:其实dedicated servers和shared servers是可以并存的,实际上,即使你使用了shared servers,某些管理操作也是必须在dedicated 模式下来做的,比如startup或shutdown database。如果你实在难以选择,如果你的应用可能一部分是OLTP的(用户量也很大),一部分是DW的,其实你可以考虑同时使用dedicated servers和shared servers。

 

2、服务器模式的设置

=============================================================================

启用专用服务器

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

dedicated servers不需要专门的设置,这个是oracle的默认选项。

 

启用共享服务器

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

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

A.设置初始化参数 SHARED_SERVERS 大于0,可以使用alter system命令动态的设置 也可以在spfile里面修改初始化参数SHARED_SERVERS    的值大于0,然后shutdown  oracle,然后restart oracle  即可启动共享模式,其他的共享服务器参数可以不用设置

  参考语句:

  SQL> alter system set shared_servers = 1 scope=both ;
  SQL> alter system set max_shared_servers = 5 scope=both ;

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

  SQL> alter system set dispatchers="(PROTOCOL=TCP) (SERVICE=mydbXDB)(SERVICE=mydb)";

  前面表示的是协议,后面的service 分别指定要采用共享服务器模式的服务名称

  oracle文档上说该步骤不是必须做的,但是我在实际中发现如果只是设置了shared_server参数,

  而把dispatches参数设置为空的话,不能启动共享服务器,使用上面的模式指定只启动某个服务的

  共享模式,如果要设置所有服务都使用共享模式,则设置为:

  alter system set dispatchers='(PROTOCOL=TCP)';

C.在客户端的tnsnames.ora 的tns设置中,在 CONNECT_DATA 设置一项中增加 (server=shared )一项,即可使用共享服务器连接

  如果服务器端没有启动共享服务器模式,而客户端使用shared方式连接的话,会出现错误提示:

  “ORA-12520: TNS: 监听程序无法找到需要的服务器类型的可用句柄”;

和共享服务器相关的参数如下:  

  max_shared_servers     --最大服务器进程数

  SHARED_SERVER_SESSIONS --指定可以同时运行的最大的共享服务会话数

  dispatchers            --协议,调度程序数,每个调度程序的最大连接数  

  max_dispatchers        --最大调度程序数  

  shared_servers         --服务器进程数  

  CIRCUITS               --指定网络会话层出入的总的虚拟回路

 

3、判断数据库使用的连接模式

========================================================================

查看当前数据库服务器的运行情况有一下几种办法:

A.从v$session里面查看:

SQL> select distinct server from v$session ;   

SQL> 


SERVER

---------

DEDICATED

NONE


SQL> 
 

如果显示的除了dedicated,还有NONE,则说明当前启动了共享服务器,并且server为none的会话正使用共享服务器连接,

同时,如果只显示有dedicated,则不能说明服务器就一定工作在专用服务器下面,此时只能说明有可能启动了共享模式,

但是无连接

可以使用下面的语句查询采用共享服务器的会话信息:

SQL>select saddr,program ,server from v$session;

SQL> 


SADDR    PROGRAM                                          SERVER

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

296FB24C plsqldev.exe                                     NONE

296FFD1C oracle@B851 (q001)                               DEDICATED

29705AA0 oracle@B851 (q000)                               DEDICATED

B.查询视图:

在网上有的资料上说只要查询下面三个视图,有记录则说明启动了共享模式,经过验证,具体情况如下:

select * from v$shared_server; ---有记录,且STATUS字段为WAIT(COMMON),则说明启动共享;

                               status为TERMINATED或者无记录,则说明没有启动共享服务器

select * from v$dispatcher;    --有无记录都不能说明启动共享服务器,只能说明是配置了dispatchers参数

select * from V$CIRCUIT ;      --有记录说明当前有使用共享模式的连接,无记录则不能判定服务器模式

 

实际查询如下(启动共享服务器的情况):

SQL> select * from v$shared_server;

NAME PADDR    STATUS             MESSAGES      BYTES     BREAKS CIRCUIT        IDLE       BUSY   REQUESTS

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

S000 2961ACA0 WAIT(COMMON)            735     611520          3 00           561435       1857        149

S001 2961CED8 TERMINATED                2        260          0 00             3001       3030          1


SQL> select CIRCUIT,DISPATCHER,SERVER,WAITER,SADDR,STATUS,BYTES from v$circuit ;


CIRCUIT  DISPATCH SERVER   WAITER   SADDR    STATUS                BYTES

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

2743471C 2961A6EC 00       00       296FB24C NORMAL                10364


SQL> select name,paddr,created,bytes from v$dispatcher;


NAME PADDR       CREATED      BYTES

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

D000 2961A6EC          7     612551


SQL> 
 

注意上述视图之间的联系,v$circuit 中的saddr和v$session 中的saddr是相等的

 

C.查询监听器的状态:

LSNRCTL> service

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=B851)(PORT=1542)))

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

    Handler(s):

      "DEDICATED" established:0 refused:0

         LOCAL SERVER

Service "mydb" has 1 instance(s).

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

    Handler(s):

      "DEDICATED" established:0 refused:0 state:ready

         LOCAL SERVER

Service "mydb_XPT" has 1 instance(s).

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

    Handler(s):

      "DEDICATED" established:0 refused:0 state:ready

         LOCAL SERVER

The command completed successfully

LSNRCTL> 

 

其中的DEDICATED 表示当前服务器处于专用服务器模式

 

如果启动共享服务器,则得到的状态是

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

LSNRCTL> service

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=B851)(PORT=1542)))

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

    Handler(s):

      "DEDICATED" established:0 refused:0

         LOCAL SERVER

Service "mydb" has 1 instance(s).

  Instance "mydb", status READY, has 2 handler(s) for this service...

    Handler(s):

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

         DISPATCHER <machine: B851, pid: 30561>

         (ADDRESS=(PROTOCOL=tcp)(HOST=B851)(PORT=60606))

      "DEDICATED" established:0 refused:0 state:ready

         LOCAL SERVER

Service "mydbXDB" has 1 instance(s).

  Instance "mydb", status READY, has 0 handler(s) for this service...

Service "mydb_XPT" has 1 instance(s).

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

    Handler(s):

      "DEDICATED" established:0 refused:0 state:ready

         LOCAL SERVER

The command completed successfully

LSNRCTL> 

 

可以看出此时,mydb服务启动了共享模式,但是同时也支持专用模式

在实际的使用中还发现有趣的现象,如果把shared_servers 和 max_shared_servers 同时设置成0,

但是保持 dispatcher 参数的值不变,则再查看监听时,出现下面的情况:

Service "mydb" has 1 instance(s).

  Instance "mydb", status READY, has 2 handler(s) for this service...

    Handler(s):

      "D000" established:0 refused:0 current:0 max:1022 state:blocked

         DISPATCHER <machine: LOCALHOST, pid: 30561>

         (ADDRESS=(PROTOCOL=tcp)(HOST=LOCALHOST)(PORT=60606))

      "DEDICATED" established:0 refused:0 state:ready

         LOCAL SERVER

..................

此时的共享进程还在,但是状态为阻塞

 

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。

 

5、禁用共享服务器模式

==============================================================================

You disable shared server by setting SHARED_SERVERS to 0. No new client can connect in shared mode. However, when you set SHARED_SERVERS to 0, Oracle Database retains some shared servers until all shared server connections are closed. The number of shared servers retained is either the number specified by the preceding setting of SHARED_SERVERS or the value of the MAX_SHARED_SERVERS parameter, whichever is smaller. If both SHARED_SERVERS and MAX_SHARED_SERVERS are set to 0, then all shared servers will terminate and requests from remaining shared server clients will be queued until the value of SHARED_SERVERS or MAX_SHARED_SERVERS is raised again.

---如果同时把SHARED_SERVERS and MAX_SHARED_SERVERS 都设置成0,则共享服务器将关闭,并且保留的共享服务器的

请求将进入队列等待,一直到这两个参数的值重新被设置

To terminate dispatchers once all shared server clients disconnect, enter this statement:

ALTER SYSTEM SET DISPATCHERS = '';

禁用的实验:

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

alter system set shared_servers = 0 ;

alter system set max_shared_servers = 0 ;

 

在已经建立共享模式的客户端执行查询,一直处于等待,查看视图:

SQL> select circuit,saddr,status,queue from v$circuit;


CIRCUIT  SADDR    STATUS           QUEUE

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

27434010 296F8CE4 NORMAL           COMMON

2743471C 296FB24C NORMAL           NONE


2 rows selected.


SQL> select program,saddr,server,status from v$session where saddr in ('296F8CE4','296FB24C');

 
PROGRAM                                          SADDR    SERVER    STATUS

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

plsqldev.exe                                     296F8CE4 NONE      INACTIVE

plsqldev.exe                                     296FB24C NONE      INACTIVE


2 rows selected.


SQL> 

 

恢复参数值:

SQL> alter system set shared_servers = 1; 

System altered.

SQL> alter system set max_shared_servers = 5;

System altered.

SQL> 

 

前台的查询恢复正常,查看视图:

SQL> select circuit,saddr,status,queue from v$circuit;

CIRCUIT  SADDR    STATUS           QUEUE

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

27434010 296F8CE4 NORMAL           NONE

2743471C 296FB24C NORMAL           NONE

2 rows selected.

SQL> 

 

 

6、和共享服务器相关的视图

==============================================================================

View                    Description

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

V$DISPATCHER            Provides information on the dispatcher processes, including name, network address, status,                            various usage statistics, and index number.

V$DISPATCHER_CONFIG     Provides configuration information about the dispatchers.

V$DISPATCHER_RATE       Provides rate statistics for the dispatcher processes.

V$QUEUE                 Contains information on the shared server message queues.

V$SHARED_SERVER         Contains information on the shared servers.

V$CIRCUIT               Contains information about virtual circuits, which are user connections to the database                               through dispatchers and servers.

V$SHARED_SERVER_MONITOR Contains information for tuning shared server.

V$SGA                   Contains size information about various system global area (SGA) groups. May be useful when                           tuning shared server.

V$SGASTAT               Contains detailed statistical information about the SGA, useful for tuning.

V$SHARED_POOL_RESERVED  Lists statistics to help tune the reserved pool and space within the shared pool.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值