1专用服务器连接及共享服务器连接的区别
在建立Oracle数据库的时候,应该会在数据库建立助手向导上面看到这么一个选项,就是数据库的连接模式采用什么方式。在Oracle9i或者10g中,可以看到有2种连接模式,一种叫做专用服务器连接(dedicated server) ,另外一种叫做共享服务器连接(shared server)。下面我们来分类说一下这两种连接方式的不同点。
专用服务器模式就是说每次在对Oracle进行访问的时候,Oracle服务器的Listener会得到这个访问请求,然后回为这个访问创建一个新的进程来进行服务。所以说,对于每一个客户端的访问,都会生成一个新的进程进行服务,是一种类似一对一的映射关系。这种连接模式的一个很重要的特点就是UGA(用户全局域)是存储在PGA(进程全局域)中的,这个特性也很好说明了当前用户的内存空间是按照进程来进行分配的。
而另外的共享服务器连接则是一种在程序编写的时候通常会用到的连接池(pool)的概念。采用这种模式的话,在数据库的初始化的时候就会创建一批服务器连接的进程,然后把这些连接进程放入一个连接池来进行管理。初始化的池中的进程数量在数据库初始化建立的时候是可以手动设置的。在连接建立的时候,Listener首先接受到客户端的建立连接的请求,然后Listener去生成一个叫做调度器(dipatcher)的进程与客户端进行连接。调度器把把客户端的请求放在SGA(系统全局域)的一个请求队列中,然后再共享服务器连接池中查找有无空闲的连接,然后让这个空闲的服务器进行处理。处理完毕以后再把处理结果放在SGA的相应队列中。调度器通过查询相应队列,得到返回结果,再返回给客户端。这种连接模式的优点在于服务器进程的数量可以得到控制,不大可能出现因为连接人数过多而造成服务器内存崩溃。但是由于增加了复杂度以及请求相应队列,可能性能上有所下降。
关于这两者的比较"假如你来到一个城市,要在这个城市的不同的地方办几件事情,在交通方面你有两种选择:一个是雇一辆专车,这辆专车将会把你从A带到B,一直等你把在B的事情办完,在把你从B带到C。。。。。。另一种选择是给出租车公司打电话订辆出租车,先把你从A带到B,然后你和出租车该干嘛干嘛,你去办你的事情,出租车去接别的生意,等你在B的事情办完了,你再跟出租车公司订车,出租车公司将会联系当时在B附近的其他出租车去接你。。。。。。
2专用服务器连接及共享服务器连接适用场景
在开发阶段中,用第一种专用服务器可能好一些,因为少了一些中间的复杂度,而且开发的时候一般连接的数量也少。而在多个应用同时使用一个数据库的实际应用环境下,采用第二种方法可能好一些,因为如果到时候突然有1000个或者10000个请求连接的话,数据库服务器如果同时建立10000个连接,肯定要受不了的。当然,也要看到时候的实际情况如何再做决定,两者没有绝对的哪种好哪种不好的差别。
3专用服务器连接及共享服务器连接的配置
首先,dedicated servers的设置非常简单-----不需要设置,这个是oracle的默认选项。
而对于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不超过这个阀值。
4共享服务器连接课堂实验
1.检查一些参数
SQL> show parameter DISPATCHERS
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dispatchers string (PROTOCOL=TCP) (SERVICE=NUODAX
DB)
max_dispatchers integer
SQL> show parameter SHARED_SERVERS
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer
shared_servers integer 1
SQL> show spparameter DISPATCHERS
SID NAME TYPE VALUE
-------- ----------------------------- ----------- ----------------------------
* dispatchers string (PROTOCOL=TCP)
(SERVICE=NUODAXDB)
* max_dispatchers integer
SQL> show spparameter SHARED_SERVERS
SID NAME TYPE VALUE
-------- ----------------------------- ----------- ----------------------------
* max_shared_servers integer
* shared_servers integer
SQL> SELECT * FROM V$DISPATCHER_CONFIG;
CONF_INDX
----------
NETWORK
--------------------------------------------------------------------------------
DISPATCHERS CONNECTIONS SESSIONS POOL TICKS INBD_TIMOUT OUTBD_TIMOUT MULT
----------- ----------- ---------- ---- ---------- ----------- ------------ ----
LISTENER
--------------------------------------------------------------------------------
SERVICE
--------------------------------------------------------------------------------
0
(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))
1 1022 1022 OFF 1 0 0 OFF
CONF_INDX
----------
NETWORK
--------------------------------------------------------------------------------
DISPATCHERS CONNECTIONS SESSIONS POOL TICKS INBD_TIMOUT OUTBD_TIMOUT MULT
----------- ----------- ---------- ---- ---------- ----------- ------------ ----
LISTENER
--------------------------------------------------------------------------------
SERVICE
--------------------------------------------------------------------------------
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.22.150)(PORT=1521))(CONNECT_DA
TA=(SERVICE_NAME=NUODA)))
NUODAXDB
CONF_INDX
----------
NETWORK
--------------------------------------------------------------------------------
DISPATCHERS CONNECTIONS SESSIONS POOL TICKS INBD_TIMOUT OUTBD_TIMOUT MULT
----------- ----------- ---------- ---- ---------- ----------- ------------ ----
LISTENER
--------------------------------------------------------------------------------
SERVICE
2.设置共享服务器数量
SQL> ALTER SYSTEM SET SHARED_SERVERS=10 SCOPE=BOTH;
System altered.
SQL> SELECT * FROM V$SHARED_SERVER;
NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT
---- -------- ---------------- ---------- ---------- ---------- --------
IDLE BUSY IN_NET OUT_NET REQUESTS
---------- ---------- ---------- ---------- ----------
S000 393DDEE4 WAIT(COMMON) 0 0 0 00
361334 27 0 0 0
S001 393E6FB8 WAIT(COMMON) 0 0 0 00
384 2 0 0 0
S002 393E7ADC WAIT(COMMON) 0 0 0 00
375 1 0 0 0
NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT
---- -------- ---------------- ---------- ---------- ---------- --------
IDLE BUSY IN_NET OUT_NET REQUESTS
---------- ---------- ---------- ---------- ----------
S003 393E8600 WAIT(COMMON) 0 0 0 00
364 4 0 0 0
S004 393E9124 WAIT(COMMON) 0 0 0 00
356 3 0 0 0
S005 393E9C48 WAIT(COMMON) 0 0 0 00
348 3 0 0 0
NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT
---- -------- ---------------- ---------- ---------- ---------- --------
IDLE BUSY IN_NET OUT_NET REQUESTS
---------- ---------- ---------- ---------- ----------
S006 393EA76C WAIT(COMMON) 0 0 0 00
341 1 0 0 0
S007 393EB290 WAIT(COMMON) 0 0 0 00
332 2 0 0 0
S008 393EBDB4 WAIT(COMMON) 0 0 0 00
312 7 0 0 0
NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT
---- -------- ---------------- ---------- ---------- ---------- --------
IDLE BUSY IN_NET OUT_NET REQUESTS
---------- ---------- ---------- ---------- ----------
S009 393EC8D8 WAIT(COMMON) 0 0 0 00
299 1 0 0 0
10 rows .
SQL> ALTER SYSTEM SET MAX_SHARED_SERVERS=100 SCOPE=BOTH;
System altered.
3.设置调度器
SQL> ALTER SYSTEM SET DISPATCHERS='(INDEX=1)(PROTOCOL=TCP)(DISPATCHERS=4)(SERVICE=NUODA)' SCOPE=BOTH;
System altered.
SQL> SELECT * FROM V$DISPATCHER;
NAME
----
NETWORK
--------------------------------------------------------------------------------
PADDR STATUS ACC MESSAGES BYTES BREAKS OWNED
-------- ---------------- --- ---------- ---------- ---------- ----------
CREATED IDLE BUSY LISTENER CONF_INDX
---------- ---------- ---------- ---------- ----------
D000
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=11492))
393DD3C0 WAIT YES 0 0 0 0
0 369470 2 0 0
NAME
----
NETWORK
--------------------------------------------------------------------------------
PADDR STATUS ACC MESSAGES BYTES BREAKS OWNED
-------- ---------------- --- ---------- ---------- ---------- ----------
CREATED IDLE BUSY LISTENER CONF_INDX
---------- ---------- ---------- ---------- ----------
D001
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=57242))
393ED3FC WAIT YES 0 0 0 0
0 349 0 0 1
NAME
----
NETWORK
--------------------------------------------------------------------------------
PADDR STATUS ACC MESSAGES BYTES BREAKS OWNED
-------- ---------------- --- ---------- ---------- ---------- ----------
CREATED IDLE BUSY LISTENER CONF_INDX
---------- ---------- ---------- ---------- ----------
D002
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=11828))
393EDF20 WAIT YES 0 0 0 0
0 327 0 0 1
NAME
----
NETWORK
--------------------------------------------------------------------------------
PADDR STATUS ACC MESSAGES BYTES BREAKS OWNED
-------- ---------------- --- ---------- ---------- ---------- ----------
CREATED IDLE BUSY LISTENER CONF_INDX
---------- ---------- ---------- ---------- ----------
D003
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=10394))
393EEA44 WAIT YES 0 0 0 0
0 305 0 0 1
NAME
----
NETWORK
--------------------------------------------------------------------------------
PADDR STATUS ACC MESSAGES BYTES BREAKS OWNED
-------- ---------------- --- ---------- ---------- ---------- ----------
CREATED IDLE BUSY LISTENER CONF_INDX
---------- ---------- ---------- ---------- ----------
D004
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=32917))
393EF568 WAIT YES 0 0 0 0
0 294 0 0 1
4.配置tns
NUODA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.22.150)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = NUODA)
)
)
5.开始测试
[oracle@localhost admin]$ sqlplus system/nuodanuoda@NUODA
SQL*Plus: Release 11.2.0.3.0 Production on Thu Jan 4 08:40:28 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@localhost admin]$ lsnrctl services
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-JAN-2018 08:41:04
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.22.150)(PORT=1521))(GLOBAL_DBNAME=NUODA)(SID_NAME=NUODA))
Services Summary...
Service "NUODA" has 1 instance(s).
Instance "NUODA", status READY, has 5 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
"D003" established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER <machine: localhost.localdomain, pid: 3275>
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=10394))
"D002" established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER <machine: localhost.localdomain, pid: 3273>
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=11828))
"D001" established:1 refused:0 current:0 max:1022 state:ready
DISPATCHER <machine: localhost.localdomain, pid: 3271>
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=57242))
"D004" established:1 refused:0 current:1 max:1022 state:ready
DISPATCHER <machine: localhost.localdomain, pid: 3277>
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=32917))
Service "NUODAXDB" has 1 instance(s).
Instance "NUODA", status READY, has 1 handler(s) for this service...
Handler(s):
"D000" established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER <machine: localhost.localdomain, pid: 2903>
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=11492))
The command completed successfully
SQL> SELECT SID, USERNAME, PROGRAM, SERVICE_NAME, SERVER FROM V$SESSION WHERE SERVER IN ('SHARED','NONE');
SID USERNAME
---------- ------------------------------
PROGRAM
------------------------------------------------
SERVICE_NAME SERVER
---------------------------------------------------------------- ---------
45 SYSTEM
sqlplus@localhost.localdomain (TNS V1-V3)
NUODA SHARED
SQL> SELECT * FROM V$SHARED_SERVER;
NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT
---- -------- ---------------- ---------- ---------- ---------- --------
IDLE BUSY IN_NET OUT_NET REQUESTS
---------- ---------- ---------- ---------- ----------
S000 393DDEE4 WAIT(COMMON) 26 7693 1 00
406698 104 5 0 13
S001 393E6FB8 EXEC 34 8780 0 00
45790 37 0 0 17
S002 393E7ADC WAIT(COMMON) 0 0 0 00
45816 1 0 0 0
NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT
---- -------- ---------------- ---------- ---------- ---------- --------
IDLE BUSY IN_NET OUT_NET REQUESTS
---------- ---------- ---------- ---------- ----------
S003 393E8600 WAIT(COMMON) 0 0 0 00
45805 4 0 0 0
S004 393E9124 WAIT(COMMON) 0 0 0 00
45797 3 0 0 0
S005 393E9C48 WAIT(COMMON) 0 0 0 00
45789 3 0 0 0
NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT
---- -------- ---------------- ---------- ---------- ---------- --------
IDLE BUSY IN_NET OUT_NET REQUESTS
---------- ---------- ---------- ---------- ----------
S006 393EA76C WAIT(COMMON) 0 0 0 00
45782 1 0 0 0
S007 393EB290 WAIT(COMMON) 0 0 0 00
45773 2 0 0 0
S008 393EBDB4 WAIT(COMMON) 0 0 0 00
45753 7 0 0 0
NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT
---- -------- ---------------- ---------- ---------- ---------- --------
IDLE BUSY IN_NET OUT_NET REQUESTS
---------- ---------- ---------- ---------- ----------
S009 393EC8D8 WAIT(COMMON) 4 341 0 00
45727 14 0 0 2
10 rows selected.
SQL> SELECT NAME, STATUS, ACCEPT FROM V$DISPATCHER;
NAME STATUS ACC
---- ---------------- ---
D000 WAIT YES
D001 WAIT YES
D002 WAIT YES
D003 WAIT YES
D004 WAIT YES

扫描二维码关注我的微学堂
搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!





