oracle服务器处理请求的两种最常用的方式,这两种方式分别是专用服务器连接和共享服务器连接。
一、专用服务器:
登录时,Oracle总会为我创建一个新的线程。这通常称为专用服务器配置,因为这个服务器进程会在我的会话生存期中专门为我服务。对于每个会话,都为出现一个新的专用服务器,会话与专用服务器之间的存在一对一的映射。按照定义,这个专用服务器不是实例的一部分。我的客户进程(也就是想要连接数据库的程序)会通过某种网络通道(如TCP/IP套接字)与这个专用服务器直接通信,并由这个服务器进程接收和执行我的SQL。如果必要,它会读取数据文件,并在数据库的缓存中查找我要的数据。也许它会完成我的更新语句,也可能会运行我的PL/SQL代码。这个服务器进程的只要目标就是对我提交的SQL调用做出响应:
具体过程如下:
①client使用设定的协议向Listener发送一个CONNECT包,建立与Listener的连接。
②Listener检查SID是否已经被定义。如果已经被定义,Listener将fork一个新的进程来处理此连接。一个Bequeath连接就在Listener和新的服务器进程之间建立起来用于传输进程初始化信息。随后,Bequeath连接将被关闭。注意,TCP sockets是被新的服务器进程继承的。
③服务器进程会给client发送一个RESEND包。
④一个新的CONNECT包在此从client发送到fork产生的服务器进程
⑤dedicated服务器进程接到新的连接包,会返回一个ACCEPT包给client。
专用服务器请求的流程下图所示:
二、共享服务器:
在共享服务器中,Oracle使用一个“共享进程”池为大量用户提供服务。共享服务器实际上就是一种连接池机制。利用共享服务器,不必为每一个数据库会话都创建一个专用服务器,而只需建立很少的一部分进程/线程,这些进程/线程将有所有会话共享。这样Oracle就能让更多的用户与数据库连接,否则很难连接更多的用户。客户进程不能与共享服务器直接对话,原因在于这个服务器进程是共享的。为了共享这些进程,还需要另外一种机制,通过这种机制才能与服务器进程“对话”。为此,Oracle使用一个或一组称为调度程序(dispatcher,也称分配程序)的进程。客户进程通过网络与一个调度程序进程通信。这个调度程序进程将客户的请求放入SGA中的请求队列(也是SGA的用途之一)。第一个空闲的共享服务器会得到这个请求,并进行处理。完成这个命令后,共享服务器会把响应放在原调度程序(即接收请求的调度程序)的响应队列中。调度程序进程一直在监听这个队列,发现有结果后,就会把结果传给客户。
具体过程如下:
①客户连接向调度器发送一个请求。调度器首先将这个请求放在SGA中的请求队列中。
②第一个可用的共享服务器从请求队列中取出这个请求并处理。
③共享服务器的处理结束后,再把响应(返回码、数据等)放到响应队列中,
④接下来调度器拿到这个响应,传回给客户。
共享服务器请求的流程下图所示:
0
下图展示了使用共享服务器连接的客户和使用专用服务器连接的客户之间的交互方式。由此还显示出,一个Oracle实 例可以同时使用这两类连接(实际上,即使配置为使用共享服务器连接,Oracle数据库也总是支持专用服务器连接)。
0
三、Oracle服务器模式(专用/共享)的优缺点:
1)专用服务器连接方式,会给每个连接分配资源,所以当连接用户太多,要对每一个连接分配资源,资源消耗大;但是连接处理的更及时,不需要等待;
2)共享服务器连接方式,就是排队接受服务,所以处于排队的用户可以有很多,这样共享服务器连接方式可以处理更多的用户的连接(排队等待),oracle预先在实例中建立指定个数的服务器进程,所有用户的连接,以排队的方式由分配器指定给服务器进程,其他的进程则排队等待,所以一旦某个用户久久不释放连接,那么就会造成排队等待时间过长,
四、怎么判断Oracle服务器模式(专用/共享)?
1。是否为配置为共享服务器,最主要的参数是
show parameter shared_server如果数值 > 0 ,就是enable了共享服务器.
也可以从v$parameter 视图中查.
2。在配置为共享服务器的情况,Client可以选择用共享服务器或者专用服务器来连接到数据库,这个参数的控制是在tnsnames.ora里设定的
aaaa=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = aaaa)(PORT = 1521))
)
(CONNECT_DATA =
(SID = aa)
(SERVER = DEDICATED)
)
)
红色部分指定了用DEDICATED方式连接DB.
另外,Background process ,以及通过本地连接进来的,只能是DEDICATED
比如说sqlplus user/pass 形式
如果DB没有配置共享服务器,那么Client只能以DEDICATED方式连接DB.
3。判断一个已经连接的session的连接方式有两种方法
方法1
select username,server from v$session;如果server = 'DEDICATED'则是DEDICATED方式
server='SHARED'则是shared方式,并且正有shared_server_process为其服务
server='NONE'的话,则是shared方式,并且当前没有shared_server_process为其服务。
方法2 仅用于Unix 底下,似乎windown不行
连接v$session, v$process 看process中的program
select p.program,s.server from v$session s , v$process p where s.paddr = p.addr
如果 program 为 。。(S0NN) 的,则是shared方式,并且正有shared_server_process为其服务
如果 program 为 。。(D0NN) 的,则是shared方式,并且当前没有shared_server_process为其服务
如果 program 为 其它的,则是'DEDICATED'方式